类文件中的内部类属性有什么用?
What is the use of InnerClass Attribute in a classfile?
我知道内部 类 和匿名 类 是 java 编译器提供的编译时构造。如果是这样,为什么类文件必须包含有关在其中声明的内部 类 的信息。 JVM 规范指出:
The InnerClasses attribute must be recognized and correctly read by a class file reader in order to properly implement the Java SE platform class libraries
我无法理解此声明的含义。有人可以详细说明这个说法吗?
该信息是 Java11 所必需的,它与内部 class 访问外部 class 的方法和变量的方式有关。
您可以在此处阅读更多相关信息:openjdk.java.net/jeps/181
编辑:
让我们考虑以下示例:
public class Outer {
public void print() {
System.out.println("Hello");
}
private class Inner {
public Inner() {
print();
}
}
}
如果用 java8(左侧)和 java11(右侧)编译此 class,您可以看到以下差异:
字节码中存储了大量关于 Java 级特征的元数据,对字节码执行没有直接影响。这有几个原因很有用。首先,Java 有反射库提供对这些信息的访问,因此它必须以某种方式在运行时对 JVM 可用。其次,它允许您针对仅二进制库进行编译。
"useless" 特性的另一个示例是 throws 子句(作为可选属性存储在字节码中)。这些是必需的,因此您可以在没有源代码的情况下针对类文件进行编译,但对字节码的执行没有影响。
我知道内部 类 和匿名 类 是 java 编译器提供的编译时构造。如果是这样,为什么类文件必须包含有关在其中声明的内部 类 的信息。 JVM 规范指出:
The InnerClasses attribute must be recognized and correctly read by a class file reader in order to properly implement the Java SE platform class libraries
我无法理解此声明的含义。有人可以详细说明这个说法吗?
该信息是 Java11 所必需的,它与内部 class 访问外部 class 的方法和变量的方式有关。
您可以在此处阅读更多相关信息:openjdk.java.net/jeps/181
编辑:
让我们考虑以下示例:
public class Outer {
public void print() {
System.out.println("Hello");
}
private class Inner {
public Inner() {
print();
}
}
}
如果用 java8(左侧)和 java11(右侧)编译此 class,您可以看到以下差异:
字节码中存储了大量关于 Java 级特征的元数据,对字节码执行没有直接影响。这有几个原因很有用。首先,Java 有反射库提供对这些信息的访问,因此它必须以某种方式在运行时对 JVM 可用。其次,它允许您针对仅二进制库进行编译。
"useless" 特性的另一个示例是 throws 子句(作为可选属性存储在字节码中)。这些是必需的,因此您可以在没有源代码的情况下针对类文件进行编译,但对字节码的执行没有影响。