2012-02-21 181 views
6

当使用java反编译器(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 2012-02-21 14:18:19

+1

你想使用这个反编译器,还是使用JAD来代替? http://www.varaneckas.com/jad – 2012-02-21 14:19:47

+0

你不知道为什么,Gergely? :)约恩是对的。 JD不识别合成方法的所有代码模式。 – 2012-02-21 21:45:14

回答

13

像这样的合成方法被创建为支持访问内部类的私有方法。由于内部类不是初始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

0

如果得到相关的.class文件(通过解压缩运行罐子),并通过JAD

JAD MyClass.class 

运行.class文件,那么你可能会发现在输出JAD文件反编译,在一个特定的行更有意义的方式,例如

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

在JAD输出显示为简单

myMemberVaiable = true 

其中myMemberVaiable是类巴兹,你将认识的一员。