2012-02-21 23 views
6

java decompiler(http://java.decompiler.free.fr/)を使用して特定のjarを逆コンパイルすると、何かを識別できない奇妙なコードがあります。誰かが私を助けることができる?java逆コンパイル

Foo.access$004(Foo.this); 

またはこの

Bar.access$006(Bar.this); 

か、他

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

これらの方法はaccess$004access$006access$102どのようなものです:コードのようなものでしょうか?

+3

同様の質問が尋ねられ、いくつかの良い回答がありました。[こちら](http://stackoverflow.com/questions/5524358/what-is-this-referencing) – cutchin

+1

この逆コンパイラを使用しますか、代わりにJADを使用するオプションですか? http://www.varaneckas.com/jad –

+0

なぜ、Gergelyを知りませんか? :)Jörnは正しいです。 JDは合成メソッドのすべてのコードパターンを認識しません。 –

答えて

13

このような合成メソッドは、内部クラスのprivateメソッドをサポートするために作成されます。内部クラスは初期のjvmバージョンの一部ではなかったので、アクセス修飾子はこのケースを実際に処理できませんでした。解決策は、プライベート実装に委譲する追加のパッケージ可視メソッドを作成することでした。

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

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

コンパイルは、このようなInnerクラスの新しいメソッドを作成します:静的access$000をさ

Inner.access$000(inner); 

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

をそして、このようなtest方法で呼び出しを置き換えます外部クラスから可視でアクセス可能なパッケージで、同じInnerクラス内にあり、プライベートに委譲できますinnerMethod

2

これらは、場合によってはコンパイラによって作成される自動生成メソッドです(たとえば、ネストされたクラスの場合など、別のクラスのプライベートフィールドに直接アクセスする場合など)。

What is the meaning of "static synthetic"?およびSynthetic Class in Javaも参照してください。

0

あなたは、関連の.classファイル(解凍を介して実行ジャー)を取得し、JAD

JAD MyClass.class 

経由の.classファイルを実行した場合、あなたは、出力JADファイルを逆コンパイルしていることがあり、その内の特定の行より意味のある方法、例えば

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

はmyMemberVaiableはあなたが認識されるクラスバズのメンバーであり、単に

myMemberVaiable = true 

としてJAD出力に表示されます。

関連する問題