【问题标题】:What is the use of InnerClass Attribute in a classfile?类文件中的内部类属性有什么用?
【发布时间】:2019-03-09 10:06:05
【问题描述】:

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

类文件阅读器必须识别和正确读取 InnerClasses 属性才能正确实现 Java SE 平台类库

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

【问题讨论】:

标签: java class jvm bytecode inner-classes


【解决方案1】:

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

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

【讨论】:

  • 由于引用部分明确提到“为了正确实现 Java SE 平台类库”,因此反射就是答案。
【解决方案2】:

这些信息是 Java11 所必需的,它与内部类如何访问外部类的方法和变量的方式有关。

您可以在此处阅读更多信息:openjdk.java.net/jeps/181

编辑:

让我们考虑以下示例:

public class Outer {

    public void print() {
        System.out.println("Hello");
    }

    private class Inner {

        public Inner() {
            print();
        }
    }
}

如果你用java8(左边)和java11(右边)编译这个类,你可以看到以下区别:

【讨论】:

  • 不应该是[un] necessary吗? jvm 直到版本 10 都会忽略内部类属性。
  • 至于innerclass 属性,因为nestmate 属性是完全独立的,所以这个特性根本不使用它。这也适用于不同访问的反射 api。
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多