invokespecial
JVM 命令は、新しいオブジェクトを作成するときに初期化メソッド ( ) を呼び出すために使用されます<init>
。命令の説明は、スーパークラスのコンストラクターを呼び出すか、現在のクラスのコンストラクターを呼び出すかの決定は、ファイルACC_SUPER
内に設定されたフラグの状態に依存することを示唆しています (ただし、明確にはしていません)。class
Sun JVM 仕様から:
次に、次の条件がすべて真でない限り、解決されたメソッドが呼び出し用に選択されます。
- ACC_SUPER フラグ (表 4.1「クラス アクセスとプロパティ修飾子」を参照) が現在のクラスに設定されています。
--ソース(invokespecial
オペコード定義)
ACC_SUPER フラグの設定は、invokespecial 命令の 2 つの代替セマンティクスのどちらを Java 仮想マシンが表現するかを示します。ACC_SUPER フラグは、Java プログラミング言語用の Sun の古いコンパイラによってコンパイルされたコードの後方互換性のために存在します。Java 仮想マシンのすべての新しい実装は、この仕様に記載されている invokespecial のセマンティクスを実装する必要があります。Java 仮想マシンの命令セットに対する新しいコンパイラはすべて、ACC_SUPER フラグを設定する必要があります。Sun の古いコンパイラは、ACC_SUPER が設定されていない ClassFile フラグを生成しました。Sun の古い Java 仮想マシンの実装では、フラグが設定されていても無視されます。
--ソース(ClassFile
形式)
定義では、フラグは古いコンパイラとの下位互換性を保つためのものであると述べています。しかし、それは矛盾し続けますSun's older Java virtual machine implementations ignore the flag if it is set.
フラグはまだinvokespecial
オペコードで使用されていますか? 私が知る限り、それは何の目的も持たないように思われ、それがかつてあったことを示唆するリソースを見つけることができません.
ありがとう。