6

刚刚发现这一点,同时阅读eclipse JDT的文档:

IMethodBinding.getParameterTypes(): . . . 注意:结果不包括内部类 emulation引入的合成参数。

我在 JLS 中找不到对内部类仿真的任何引用......有人知道这个仿真是什么吗?举个例子,也会有所帮助。:)

4

2 回答 2

4

我认为 Eclipse 文档作者的术语有点松散。就 JLS 而言,内部类是内部类,不需要模拟。

但是,内部类由典型的 JVM实现的方式有一点棘手,这就是合成构造函数参数进入等式的地方。发生的事情是,无论它们是否嵌套,JVM 都以相同的方式实现类。没有用于引用封闭类中的变量的特殊字节码,因此编译器生成通过合成属性获取它们的代码。

更多细节可以在原始的 Sun Java 1.1 Inner Classes Specification 中找到。

于 2010-12-18T05:12:12.373 回答
2

我怀疑“内部类仿真”是编译器为内部类生成字节码的方式。
虚拟机级别没有内部类支持(至少在引入它们时)。编译内部类时,编译器必须像普通类一样生成字节码。添加对外部类实例的引用,例如:

public class Outer {

    class Inner {
        @Override
        public String toString() {
            return "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";
    }
}
于 2010-12-18T10:45:59.807 回答