为什么Java 1.0.2中的Interface Member没有设置ACC_ABSTRACT?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么Java 1.0.2中的Interface Member没有设置ACC_ABSTRACT?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1678字,纯文字阅读大概需要3分钟。
内容图文
![为什么Java 1.0.2中的Interface Member没有设置ACC_ABSTRACT?](/upload/InfoBanner/zyjiaocheng/686/1318510aaa274d74b5e11109fe85d488.jpg)
我编写了一个简单的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
?ag 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 itsACC_FINAL
?ag set.
JVM规范has similar words to say的版本9:
If the
ACC_INTERFACE
flag is set, theACC_ABSTRACT
flag must also be set, and theACC_FINAL
,ACC_SUPER
,ACC_ENUM
, andACC_MODULE
flags set must not be set.
Oracle / Sun JVM是否强制执行“必须存在”这样的要求?如果是这样,什么时候开始?如果不是,为什么JVM规范会假装要求它呢?
解决方法:
这是一个错误JDK-4059153:javac没有为接口设置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 1.0.2中的Interface Member没有设置ACC_ABSTRACT?全部内容,希望文章能够帮你解决为什么Java 1.0.2中的Interface Member没有设置ACC_ABSTRACT?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。