私はいくつかの実験を行うために単純なJavaバイトコードパーサーを作成しましたが、最近は予期せぬ場所で失敗しました。 Javaの1.1.8.16のrt.jar
からjava/lang/reflect/Member.java
を読みながら、私のパーサが怒ったMember
は(行方不明ACC_ABSTRACT
フラグに注意してください)ので、同様にスタートするので:Java 1.0.2のインターフェイスメンバーに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を、P 86は、強調追加):
インターフェースが暗黙的に抽象的である(§2.13.1) ;その
ACC_ABSTRACT
フラグはに設定する必要があります。インターフェイスは最終的なものではありません。その実装が完了することは決してできません(2.13.1)。そのため、それはそのフラグセットを持つことができませんでした。 JVM仕様has similar words to sayの
バージョン9:
ACC_INTERFACE
フラグが設定されている場合、ACC_ABSTRACT
フラグもを設定する必要があり、そしてACC_FINAL
、ACC_SUPER
、ACC_ENUM
、及びACC_MODULE
フラグを設定する必要があります設定しないでください。
Oracle/Sun JVMはこの要件を「必須」にする必要がありますか?もしそうなら、いつ?そうでない場合は、JVMの仕様が必要であると偽っているのはなぜですか?
ありがとうございます@apangin。 * 2つのリンクを使って私の謎を解きほぐしてください。 – 0xbe5077ed