2009-05-15 2 views
2

우리가 사용중인 타사 프레임 워크에서 문서화되지 않은 클래스를 약간 확장하려고합니다. 나는 JD-GUI와의 .class 파일을 디 컴파일하고 다음과 같이 정의 된 내부 클래스 참조 :

private class DeactivateAction extends AbstractAction { 
    public DeactivateAction() { 
     super("Deactivate"); 
    } 

    public void actionPerformed(ActionEvent paramActionEvent) { 
     if (MyContainingType.this.someBoolean) { 
      MyContainingType.access$102(MyContainingType.this, false); 
      MyContainingType.this.add(MyContainingType.this.interceptor); 
     } 
    } 
} 

내가 여기에 "액세스 $ (102)"라인을 해석하는 방법을 잘 모르겠습니다을. MyContainingType은 javax.swing.JLayeredPane을 확장합니다. 이것은 나를 위해 컴파일되지 않습니다, 그래서 어떻게 이것을 해석하고 내 확장 클래스에서 올바르게 변환 할 수 있습니까?

답변

5

이것은 합성 접근 장치입니다.

내부 클래스조차 실제로는 둘러싼 클래스의 개인 멤버에 액세스 할 수 없습니다. 컴파일러는 내부 클래스가 포함 된 클래스의 비공개 필드에서 작동 할 수 있도록 기본 (패키지) 액세스 메서드를 "합성"합니다.

access$102이 무엇을하는지 파악하기 위해 둘러싼 클래스를 볼 수 있어야합니다.

javap 도구는 -c 옵션과 함께 사용하면 매우 유용합니다.

0

AFAIK jd-gui는 여전히 내부 클래스에서 개선되고 있습니다. 버전 0.2.9까지는 내부 클래스를 전혀 디 컴파일 할 수 없었습니다. 이제는 훨씬 더 잘 작동하고 나는 다음 릴리스에 정말로 기대하고 있습니다!

'액세스 $ 102'는 정적 메서드의 자리 표시 자처럼 보입니다. 비슷한 서명이있는 MyContainingType에서 항목을 찾을 수 있어야합니다.