java反编译

时间:2012-02-21 14:13:41

标签: java bytecode decompiling

使用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

3 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:2)

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

另请参阅What is the meaning of "static synthetic"?Synthetic Class in Java

答案 2 :(得分:0)

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

JAD MyClass.class

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

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

在JAD输出中显示为

myMemberVaiable = true

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