次のバイトコード(例外をスローするために使用される)の例外が重複しているのはなぜだろうか。
NEW java/lang/IllegalArgumentException
DUP
INVOKESPECIAL java/lang/IllegalArgumentException <init> ()V
ATHROW
この行ごとに分析します。 [] = op が使用された後の新しいスタック:
IllegalArgumentException
をスタックに置きます[SomeIllegalArgumentException]バイト コードでは、最初にクラスによってオブジェクトが作成され、次にそのオブジェクトに対してコンストラクターが呼び出されます。コンストラクターのシグネチャは、何かを返すため、 V
for で終わります。void
これは、コンストラクターが呼び出された後にスローできるように、オブジェクトへの元の参照のコピーをスタック (または変数) に保持する必要があることを意味します。
ところで、コンストラクター<init>
の内部名は であり、静的初期化子コードの内部名は<clinit>