gpt4 book ai didi

java - 为什么 Java 1.0.2 的接口(interface) Member 没有设置 ACC_ABSTRACT?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:23 25 4
gpt4 key购买 nike

我写了一个简单的 Java 字节码解析器来做一些实验,最近它在一个意想不到的地方失败了。从 Java 1.1.8.16 的 rt.jar 读取 java/lang/reflect/Member.java 时,我的解析器因为 Member 开始像这样输出(注意缺少的 ACC_ABSTRACT 标志):

Classfile Member.class
Last modified Aug 8, 2002; size 350 bytes
MD5 checksum 9a1aaec8e70e9a2ff9d63331cb0ea34e
Compiled from "Member.java"
public interface java.lang.reflect.Member
minor version: 3
major version: 45
flags: (0x0201) ACC_PUBLIC, ACC_INTERFACE
...

Java 1.2.2.17 的版本更正了这一点并将标志设置为 0x0601 (ACC_ABSTRACT | ACC_INTERFACE | ACC_PUBLIC)。

我能找到的最早的 JVM 规范(据称是 1.0.2)是这样说的(§4.1,第 86 页,已强调):

An interface is implicitly abstract (§2.13.1); its ACC_ABSTRACT flag must be set. An interface cannot be final; its implementation could never be completed (§2.13.1) if it were, so it could not have its ACC_FINAL flag set.

JVM 规范第 9 版 has similar words to say :

If the ACC_INTERFACE flag is set, the ACC_ABSTRACT flag must also be set, and the ACC_FINAL, ACC_SUPER, ACC_ENUM, and ACC_MODULE flags set must not be set.

Oracle/Sun JVM 是否强制要求“必须”如此?如果有,从什么时候开始?如果不是,为什么 JVM 规范会假装它是必需的?

最佳答案

这是一个错误 JDK-4059153 : javac 没有为接口(interface)设置 ACC_ABSTRACT

该错误已在 1.2 中得到修复,但由于已经有许多类使用此错误编译,JVM 找到了一个变通方法,可以为所有具有 ACC_INTERFACE 的类自动添加 ACC_ABSTRACT。这一直有效到 Java 6,当时它最终决定严格遵循更新类文件的规范。但是,为了与旧版本的类文件向后兼容,解决方法直到现在仍然存在,请参阅 classFileParser.cpp :

    if ((flags & JVM_ACC_INTERFACE) && _major_version < JAVA_6_VERSION) {
// Set abstract bit for old class files for backward compatibility
flags |= JVM_ACC_ABSTRACT;
}

关于java - 为什么 Java 1.0.2 的接口(interface) Member 没有设置 ACC_ABSTRACT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47870991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com