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