【发布时间】:2011-05-27 11:22:39
【问题描述】:
刚刚在阅读eclipse JDT的文档时发现了这一点:
IMethodBinding.getParameterTypes(): 。 . . 注意:结果不包括内部类仿真引入的合成参数。
我在 JLS 中找不到对 inner class emulation 的任何引用...有人知道这个仿真是什么吗?举个例子,也会有所帮助。 :)
【问题讨论】:
标签: java eclipse eclipse-jdt emulation
刚刚在阅读eclipse JDT的文档时发现了这一点:
IMethodBinding.getParameterTypes(): 。 . . 注意:结果不包括内部类仿真引入的合成参数。
我在 JLS 中找不到对 inner class emulation 的任何引用...有人知道这个仿真是什么吗?举个例子,也会有所帮助。 :)
【问题讨论】:
标签: java eclipse eclipse-jdt emulation
我怀疑“内部类仿真”是编译器为内部类生成字节码的方式。
虚拟机级别没有内部类支持(至少在引入它们时)。编译内部类时,编译器必须像 normal 类一样生成字节码。添加对外部类实例的引用,例如:
public class Outer {
class Inner {
@Override
public String toString() {
return "Inner";
}
}
}
Inner 类被编译成类似于:
class Outer$Inner {
final Outer this$0; // the instance of the outer class
Outer$Inner(Outer outer) {
super();
this$0 = outer;
}
public String toString() {
return "Inner";
}
}
【讨论】:
我认为 Eclipse 文档编写者的术语有点松散。就 JLS 而言,内部类就是内部类,不需要模拟。
然而,内部类由典型的 JVM 实现的方式有点棘手,这就是合成构造函数参数进入等式的地方。发生的事情是,无论它们是否嵌套,JVM 都以相同的方式实现类。没有特殊的字节码来引用封闭类中的变量,因此编译器会生成通过合成属性获取它们的代码。
更多细节可以在原始的 Sun Java 1.1 Inner Classes Specification.中找到
【讨论】:
this$0。下一个最外面的封闭实例是this$1,依此类推。 (在任何给定的内部类中最多需要一个这样的字段。)。 . . .所有这些合成字段都由构造函数参数初始化。 . . .所有这些构造函数参数都被认为是合成的。