4

假设我有这个类:

public class class1 extends Applet implements Runnable
{
    private String s;
    private URL u;
    ...
}

第二类:

class TS extends Thread
{
    private final class1 _$97913;
    public TS(class1 paramclass1)
    {
        this._$97913 = paramclass1;
    }
    ...
    public void PostData()
    {
        ...
        class1.access$16(this._$97913, new Socket(class1.access$17(this._$97913), 80);
        ...
    }
    ...
}

有人可以解释如何从 class1 class1.access$16(this._$97913, new Socket(class1.access$17(this._$97913), 80);引用吗?private URL u;

从哪里来access$16?这叫什么,我在哪里可以了解更多关于它的信息?

好的,这是反编译代码的结果,有没有办法将数字(access$16access$17等)与原始变量或类相关联?据我所知,唯一的方法是手动执行(即查看在哪里引用了什么并猜测由于“this”类收到了一个 URL,那么“this”必须与“that”变量相关联)?

4

2 回答 2

5

这是反编译java的结果吗?

它看起来像是一种合成方法,允许外部和内部类访问彼此的私有字段或方法。

当嵌套类使用 private 修饰符指定的属性被封闭类访问时,Java 编译器必须在嵌套类上创建合成方法。下一个代码示例说明了这种情况。

...

如上面的屏幕快照所示,已在嵌套类 NestedClass 上创建了一个名为 access$100 的合成方法,以将其私有 String 提供给封闭类。请注意,仅为封闭类访问的 NestedClass 的单个私有属性添加合成方法。

于 2011-04-02T16:27:21.290 回答
4

好的,这是反编译代码的结果,有没有办法将数字(access$16access$17等)与原始变量或类相关联?据我所知,唯一的方法是手动进行(即查看在哪里引用了什么并猜测由于“this”类收到了一个 URL,那么“this”必须与“that”变量相关联)?

access$x如果您从嵌套类(或相反,或从一个嵌套类到另一个)访问私有方法或变量,则会创建这些方法。它们由编译器创建,因为 VM 不允许直接访问私有变量。

如果反编译器让这些方法调用保留在使用类的重新创建源代码中,它还应该让合成方法定义保留在使用类的重新创建源代码中。如果是这样,请查看作为相关方法接收者的类(class1在您的情况下),应该有这样的方法(access$17)。在此方法的代码中,您可以看到此处访问了哪个真实方法(或变量)。

如果反编译器删除了合成方法,这要么是一个错误,要么可能是可配置的。也可能是您必须一次将所有类传递给它,然后它可以在任何地方放入正确的方法/字段 - 查看它的文档。


如果您在方法调用的点之前有类(以及它们的超类,如果有的话),那么您应该有这些方法。

从您发布的片段中,应该有一个access$16andaccess$17方法class1(或者class1这里是一个局部变量?)。

如果不是,也许你的反编译器试图变得更聪明,那么他应该。您可以查看 的输出javap class1以查看方法是否存在以及javap -c class1整个字节码。或者使用另一个反编译器。

于 2011-04-02T18:19:46.300 回答