java反编译

当使用java反编译器(http://java.decompiler.free.fr/)反编译一个特定的jar时,我得到了一些奇怪的代码,我无法识别它是什么。 有人能帮我吗? 代码是这样的:

Foo.access$004(Foo.this); 

或这个

 Bar.access$006(Bar.this); 

要不然

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

这些方法有什么access$004access$006access$102

这样的合成方法被创建以支持内部类的访问私有方法。 由于内部类不是初始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类中,它可以委托给私有的innerMethod

这些是自动生成的方法,在某些情况下由编译器创建(例如,当直接访问另一个类的私有字段时,例如,在嵌套类的情况下)。

另请参见“静态合成”的含义是什么? 和Java中的合成类 。

如果你得到相关的.class文件(通过unzip运行jar),并通过JAD运行.class文件

 JAD MyClass.class 

那么您可能会发现输出JAD文件以更有意义的方式反编译该特定行,例如

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

简单地显示在JAD输出中

 myMemberVaiable = true 

其中myMemberVaiable是您将识别的Baz类的成员。