类文件中InnerClass属性的用途是什么?

时间:2019-03-09 10:06:05

标签: java class jvm bytecode inner-classes

我知道内部类和匿名类是java编译器提供的编译时结构。如果是这样,为什么类文件必须包含有关在其中声明的内部类的信息。 JVM规范指出:

  

为了正确实现Java SE平台类库,必须由类文件读取器识别并正确读取InnerClasses属性。

我无法理解此声明的含义。有人可以详细说明一下吗?

2 个答案:

答案 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(右侧)编译此类,则可以看到以下差异:

enter image description here enter image description here