【问题标题】:What is "inner class emulation" in Java?Java中的“内部类仿真”是什么?
【发布时间】:2011-05-27 11:22:39
【问题描述】:

刚刚在阅读eclipse JDT的文档时发现了这一点:

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

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

【问题讨论】:

    标签: java eclipse eclipse-jdt emulation


    【解决方案1】:

    我怀疑“内部类仿真”是编译器为内部类生成字节码的方式。
    虚拟机级别没有内部类支持(至少在引入它们时)。编译内部类时,编译器必须像 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";
        }
    }
    

    【讨论】:

    • 是的,对外部类的引用是由合成构造函数参数初始化的合成字段。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。我同意你的看法。我在retrologic.com/innerclasses.doc10.html 中找到的附加信息补充了您所说的:指向最外层封闭实例的合成字段名为this$0。下一个最外面的封闭实例是this$1,依此类推。 (在任何给定的内部类中最多需要一个这样的字段。)。 . . .所有这些合成字段都由构造函数参数初始化。 . . .所有这些构造函数参数都被认为是合成的。
    • @John - 那是同一份文件......在不同的地方发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2012-10-23
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多