当你有一个像Java中的access$002这样的变量时,这意味着什么?

2022-09-03 13:57:39

我有一个java jar,我已经在原始开发人员的许可下进行了反编译,我们将使用它,直到他们能给我们一个源代码的副本。我遇到了一个类似于以下内容的类的成员:

Classname.access$002(Param1, Param2);

Classname是正确的,但是access$002看起来不对(除了名称access$204和末尾附加了其他数字之外,还有其他一些类似的名称),我想知道这在Java中是否有任何意义,或者是否是因为反编译操作不完整。

我正在使用JD-GUI来反编译这些类。

还值得一提的是,至少在类 Classname 中,没有一个方法具有与 access$002 方法相同的签名。


答案 1

这些方法是从内部非静态类到嵌套类的成员的调用。access$XXX

public class DummyDummy {

private int x = 0;
private Inner i = new Inner();
private int foo(int a, int b) {
    return a+b+x;
}

private class Inner {
    void doIt() {
        System.out.println(
         // Here, DummyDummy.access$0(DummyDummy, int, int) is called 
         // which calls DummyDummy.foo(int, int)
             foo(1,2)                 );
    }
}

public static void main(String[] args) {
    new DummyDummy().i.doIt();
}

}

答案 2

推荐