我知道内部类和匿名类是java编译器提供的编译时结构。如果是这样,为什么类文件必须包含有关在其中声明的内部类的信息。 JVM规范指出:
为了正确实现Java SE平台类库,必须由类文件读取器识别并正确读取InnerClasses属性。
我无法理解此声明的含义。有人可以详细说明一下吗?
答案 0 :(得分:2)
字节码中存储了许多有关Java级别功能的元数据,这些元数据对字节码执行没有直接影响。出于几个原因,这很有用。首先,Java具有反射库,该反射库提供对这些信息的访问,因此,JVM必须以某种方式在运行时可用。其次,它允许您针对仅二进制库进行编译。
“无用”功能的另一个示例是throws子句(作为可选属性存储在字节码中)。这些是必需的,因此您可以在没有源代码的情况下针对类文件进行编译,但对字节码的执行没有影响。
答案 1 :(得分:1)
该信息对于Java11来说是必需的,并且与内部类如何访问外部类的方法和变量的方式有关。
您可以在此处了解更多信息:openjdk.java.net/jeps/181
编辑:
让我们考虑以下示例:
public class Outer {
public void print() {
System.out.println("Hello");
}
private class Inner {
public Inner() {
print();
}
}
}
如果使用java8(左侧)和java11(右侧)编译此类,则可以看到以下差异: