Java中的“内部类仿真”是什么?

6

我在阅读 eclipse JDT 的文档时发现了这段内容:

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

我在 JLS 中没有找到任何关于 内部类模拟 的参考......有人知道这个模拟是什么吗?提供一个例子会更好 :)

2个回答

4
我认为Eclipse文档编写人员在术语上有些不严谨。就JLS而言,内部类是内部类,不需要模拟。
然而,内部类如何被典型的JVM实现有一点棘手,这就是合成构造函数参数出现的地方。发生的情况是JVM实现类的方式相同,无论它们是否嵌套。没有特殊的字节码用于引用封闭类中的变量,因此编译器生成的代码通过合成属性获取它们。
更多细节可以在原始的Sun Java 1.1 内部类规范中找到。

谢谢。我同意你的观点。我在http://www.retrologic.com/innerclasses.doc10.html找到了一些补充说明,与你所说的相符:*指向最外层封闭实例的合成字段名为`this$0`。下一个最外层封闭实例是`this$1`,以此类推。(在任何给定的**内部类**中最多只需要一个这样的字段。)……所有这些合成字段都由构造函数参数初始化……所有这样的构造函数参数都被视为合成的。* - John Assymptoth
@John - 那是同一份文件...只是在不同的地方发布了。 - Stephen C

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";
    }
}

是的,对外部类的引用是由合成构造函数参数初始化的合成字段。 - John Assymptoth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接