2012-02-21 2 views
6

자바 디 컴파일러 (http://java.decompiler.free.fr/)를 사용하여 특정 jar 파일을 디 컴파일 할 때 나는 이상한 코드가 무엇인지 알 수 없다. 누군가 나를 도울 수 있습니까? 코드는 무엇인가 같다 :자바 디 컴파일

Foo.access$004(Foo.this); 

또는이

Bar.access$006(Bar.this); 

또는 이러한 방법 access$004, access$006access$102은 무엇 다른

Baz.access$102(Baz.this, true) 

?

+3

비슷한 질문이 제기되어 좋은 반응을 얻었습니다 (http://stackoverflow.com/questions/5524358/what-is-this-referencing). – cutchin

+1

이 디 컴파일러를 사용 하시겠습니까? 아니면 대신 JAD를 사용하는 옵션입니까? http://www.varaneckas.com/jad –

+0

이유를 모르겠습니까, Gergely? :) Jörn이 옳습니다. JD는 합성 방법에 대한 모든 코드 패턴을 인식하지 못합니다. –

답변

13

이와 같은 합성 메서드는 내부 클래스의 개인 메서드를 처리하는 것을 지원하기 위해 만들어집니다. 내부 클래스는 초기 jvm 버전의 일부가 아니기 때문에 액세스 수정자는 실제로이 경우를 처리 할 수 ​​없습니다. 해결책은 개인 구현에 위임하는 추가 패키지 표시 메소드를 만드는 것이 었습니다.

public class Example { 
    private static class Inner { 
     private void innerMethod() { ... } 
    } 

    public void test() { 
     Inner inner = ... 
     inner.innerMethod(): 
    } 
} 

컴파일이 같은 Inner 클래스의 새로운 방법을 만들 것입니다 :

static void access$000(Inner inner) { 
    inner.innerMethod(); 
} 

을 그리고이 같은 test 방법에 전화를 대체 :

Inner.access$000(inner); 

정적 access$000은 외부 클래스에서 볼 수 있고 액세스 할 수있는 패키지이며, 동일한 Inner 클래스 내부에 있으므로 private 클래스에 위임 할 수 있습니다. innerMethod.

0

당신이 관련 된 .class 파일 (압축 해제를 통해 실행 항아리)를 얻고, JAD

JAD MyClass.class 

을 통해의 .class 파일을 실행하면 다음 출력 JAD 파일을 디 컴파일 것을 찾을 수있는 특히 라인 더 의미있는 방법, 예.

Baz.access$102(Baz.this, true) 

는 myMemberVaiable 당신이 인식 클래스 바즈의 멤버 단순히

myMemberVaiable = true 

로 JAD 출력에 표시됩니다.