当使用java反编译器(http://java.decompiler.free.fr/)对特定的jar进行反编译时,我得到了一些奇怪的代码,我无法识别是什么。有人能帮我吗?代码类似于:
Foo.access$004(Foo.this);或者这个
Bar.access$006(Bar.this);否则
Baz.access$102(Baz.this, true)access$004、access$006和access$102是什么方法?
发布于 2012-02-21 22:26:18
创建这样的合成方法是为了支持访问内部类的私有方法。由于内部类不是初始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。
发布于 2012-02-21 22:19:34
这些是由编译器在某些情况下创建的自动生成的方法(例如,当直接访问另一个类的私有字段时,例如,在嵌套类的情况下)。
另请参见What is the meaning of "static synthetic"?和Synthetic Class in Java。
发布于 2016-01-27 08:23:08
如果您获得了相关的.class文件(通过解压缩运行jar ),并通过JAD运行.class文件
JAD MyClass.class然后,您可能会发现输出JAD文件以更有意义的方式反编译了特定的行,例如
Baz.access$102(Baz.this, true)在JAD输出中显示为
myMemberVaiable = true其中myMemberVaiable是Baz类的成员,您可以识别它。
https://stackoverflow.com/questions/9379048
复制相似问题