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);
        }
    }
}

ここで「access$102」行を解釈する方法がわかりません。MyContainingType は javax.swing.JLayeredPane を拡張します。これはコンパイルされないので、これを解釈して拡張クラスで正しく変換するにはどうすればよいですか?

4

2 に答える 2

5

それは合成アクセサーです。

内部クラスでさえ、それを囲むクラスのプライベート メンバーに実際にアクセスすることはできません。コンパイラは、デフォルト (パッケージ) アクセス メソッドを「合成」して、内部クラスが外側のクラスのプライベート フィールドを操作できるようにします。

囲んでいるクラスを見て、何をしているのかを理解できるはずですaccess$102

-c オプション付きのjavapツールも非常に便利です。

于 2009-05-15T21:16:44.830 に答える
0

私の知る限り、jd-gui はまだ内部クラスを改善しています。バージョン 0.2.9 までは、内部クラスを逆コンパイルできませんでした。今ではずっとうまく機能しており、次のリリースが本当に楽しみです!

「access$102」は静的メソッドのプレースホルダーのように見えます。同様の署名を持つ MyContainingType で何かを見つけることができるはずです。

于 2009-05-15T21:45:57.253 に答える