这是什么参考?
假设我有这个课程:
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.access$16(this._$97913, new Socket(class1.access$17(this._$97913), 80);
是如何引用private URL u;
来自class1?
access$16
来自哪里? 这叫什么,我在哪里可以了解更多?
好吧,这是反编译代码的结果,有没有办法将数字( access$16
, access$17
等)与原始变量或类相关联? 从我所看到的,唯一的方法是手动这样做(即看到被引用的地方并猜测,因为’这个’类接收了一个URL,那么’this’必须与’that’变量相关联)?
好吧,这是反编译代码的结果,有没有办法将数字(
access$16
,access$17
等)与原始变量或类相关联? 从我所看到的,唯一的方法是手动这样做(即看到被引用的地方并猜测,因为’这个’类接收了一个URL,那么’this’必须与’that’变量相关联)?
如果从嵌套类(或其他方式,或从一个嵌套类到另一个嵌套类)访问私有方法或变量,则会创建access$x
方法。 它们由编译器创建,因为VM不允许直接访问私有变量。
如果反编译器允许这些方法调用保留在using类的重新创建的源代码中,那么它还应该让合成方法定义保留在已使用类的重新创建的源代码中。 如果是这样,看看作为相关方法的接收者的类(在你的情况下是class1
),应该有这样的方法( access$17
)。 在此方法的代码中,您可以在此处查看访问哪个实际方法(或变量)。
如果反编译器删除了合成方法,这可能是一个错误,也可能是可配置的。 也可能是您必须立即将所有类传递给它,然后它可以在任何地方放入正确的方法/字段 – 查看其文档。
如果您在方法调用的点之前有类 (以及它们的超类,如果有的话),那么您应该拥有这些方法。
从你发布的代码片段中,应该有一个access$16
并且在class1
access$17
方法(或者class1
是一个局部变量吗?)。
如果不是,也许你的反编译器试图变得更聪明,那么他应该。 您可以查看javap class1
的输出以查看方法是否存在,并查看整个字节码的javap -c class1
。 或者使用另一个反编译器。
这是反编译java的结果吗?
它看起来像一个合成方法 ,允许外部和内部类访问彼此的私有字段或方法。
当使用private修饰符指定的属性被封闭类访问时,Java编译器必须在嵌套类上创建合成方法。 下一个代码示例表明了这种情况。
…
如上面的屏幕快照所示,已在嵌套类NestedClass上创建名为access $ 100的合成方法,以将其私有String提供给封闭类。 请注意,仅为封闭类访问的NestedClass的单个私有属性添加合成方法。