在类文件中使用Inner Class Attribute有什么用?

问题描述 投票:0回答:2

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

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

我无法理解这句话的含义。有人可以详细说明这个陈述吗?

java class jvm bytecode inner-classes
2个回答
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


2
投票

字节码中存储了大量关于Java级别功能的元数据,对字节码执行没有直接影响。由于几个原因,这很有用。首先,Java具有提供对此信息的访问的反射库,因此它必须在运行时以某种方式提供给JVM。其次,它允许您针对仅二进制库进行编译。

“无用”特性的另一个例子是throws子句(存储为字节码中的可选属性)。这些都是必需的,因此您可以在没有源的情况下针对类文件进行编译,但不会影响字节码的执行。

© www.soinside.com 2019 - 2024. All rights reserved.