2016-06-27 6 views
-1

저는 3 일 동안이 작업을 직접 해왔으며 답변을 찾을 수 없습니다. 경험 많은 사람들의 조언이 필요합니다. :)모든 인터페이스 메서드를 재정의 할 수 없습니다.

우리는 프로그래머에게 우리에게 몇 년 전의 시간을 남겼습니다. 우리가 가지고있는 것은 .jar 파일이며 원래 소스는 없습니다. 그래서이 .jar을 약간 조정하기 위해 decompiler를 실행하고 우리 자신의 클래스 파일을 삽입하고 .jar에있는 기존 클래스 파일 중 하나를 수정하여 호출했습니다. 그것은 응용 프로그램의 특정 지점에 필요한 코드를 삽입하는 쉬운 방법이었습니다 (이 것은 너무 커서 전체 프로젝트를 디 컴파일하는 것은 약간 어렵고 오류가 발생하기 쉽습니다). 이 모든 것이 지난 2 년간 정상적으로 작동했습니다. 그러나 지난 주 나는 물건을보다 효율적으로 만들기 위해 스레드가 필요하다는 것을 알았습니다. ...

코드는 스레드 초기화에 도달하자마자 오류없이 완전히 삭제됩니다. 나는 실제 Runnable 초기화로 그것을 더 좁혔다. 그리고 나서 나는 겉으로보기에 인터페이스를 시도했다. 기존 jar 파일 내에서 실행 중이므로 내 자신의 로그 파일에 쓰는 것 외에 다른 디버그 액세스 권한이 있습니다. 그래서 Runnable 초기화 전에 로그 라인을 작성하고 아무 것도 나오지 않습니다.

그래서 호출은 실행 가능한 변수를 설정합니다 :

Runnable r; 

은 그래서 참조를 찾는 데에 문제가 없는지 잘 보인다. 그러나 방법을 덮어 쓰면 즉시 :

r = new Runnable(){ 
    public void run(){ 

    } 
}; 

이 줄 아래의 내 로그 파일에 출력되지 않습니다. 그래서. 어떤 이유로 든 액세스 수정 자 문제가있을 수 있습니다. 그래서 런타임에 체크 :

Method[] methods = Runnable.class.getDeclaredMethods(); 
for (int i = 0; i < methods.length; i++) { 
    writeToLog("public method: " + methods[i]); 
} 

내가 끝낼 :

"공개 방법 : 공공 추상적 무효 java.lang.Runnable.run을()"나에게 접근 보이는

...

누구나 내게 왜 실패 할 수 있는지에 대한 통찰력을 줄 수 있습니까? 그렇지 않으면 내 시도/주위에 잡을 내 로그 출력해야합니다 일부 unchecked 예외 가정합니다. 만약 내가 그것을 디버깅 할 수있는 능력이 있다면. 심지어 원격 디버거 옵션을 시도했지만 아무 것도 출력하지 않는 것 같습니다. 어쩌면이 항아리에는 모든 것을 덮어 쓰는 내부 오류 처리가있을 수 있습니다. 어쩌면 내가 너무 오랫동안이 일을 해왔으니 나는 이것을 알아 내기위한 잘못된 길로 완전히 빠져있다!

내 코드는 모두 사용할 준비가되었습니다. 그냥 피 묻은 Runnable에 붙여야합니다! 그래서 초조 한 :) 사전에 감사드립니다!

tldr : 소스 액세스 권한이 없기 때문에 클래스 파일을 기존 jar 파일에 삽입하고 있습니다. 모든 코드는 잘 실행하지만 인터페이스 방법 (특히 Runnable를) 덮어 쓸 수 없습니다 내가 알아낼 수 없습니다 이유가 인 IntelliJ IDE 제안에 대한 @mikibrv 할 디버그 액세스 중 하나

갱신 감사가 없기 때문입니다. 이제 오류 메시지가 나타납니다.

명확하게 찾을 수있는 클래스가 정의되지 않은 이유는 무엇입니까?

답변

3

Maven을 사용하는 경우 로컬 Maven 저장소에 JAR을 설치하고 프로젝트에 종속성으로 추가 할 수 있습니다. 그런 다음 실제로 새 프로젝트에서 클래스를 사용하고 확장 할 수 있습니다. 이처럼

:

https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html는 또한 인 IntelliJ 같은 IDE의 쉬운 접근을 위해 당신의 JAR 파일을 디 컴파일 할 수있을 것입니다. 그리고 심지어 그것을 디버그하십시오.

또 다른 아이디어는 자바의 새로운 버전으로 다시 디 컴파일하고 다시 컴파일 한 이후에 각 클래스를 가져 오는 것입니다. 아마 jar 파일은 이전 버전의 Java로 컴파일되었습니다.

+2

그리고 git와 코드 저장소를 사용하여 시작하십시오. –

+0

컴파일러 버전에 대해서는 사실입니다. Java 6 빌드였습니다. 그러나 내 통제가 불가능한 이유로 Java 6으로 유지해야합니다. IntelliJ에 대해서는 들어 보지 못했지만 지금은 다운로드하려고합니다. 그러나 그동안 실행 가능한 초기화가 실패하는 이유를 생각해 볼 수 있습니까? 이미 컴파일 된 .jar에서 활성화되어 있다는 것을 모르는 일부 고유 한 Java 보안이 있습니까? 나는 단지 그것을 얻지 않는다. – Liam

+0

승리를 위해 @mikibrv Intellij! 그 충고에 감사드립니다. 그 IDE는 서사시 다. 나는 지금까지 그것에 대해 들어 본 적이 없다. 지금은 적어도 오류 메시지가 있습니다 : java.lang.NoClassDefFoundError. 내가 할 연구가 ... 왜 이것이 오류가 될지에 대한 아이디어? – Liam

관련 문제