10

次のバイトコード(例外をスローするために使用される)の例外が重複しているのはなぜだろうか。

NEW java/lang/IllegalArgumentException
DUP
INVOKESPECIAL java/lang/IllegalArgumentException <init> ()V
ATHROW
4

2 に答える 2

20

この行ごとに分析します。 [] = op が使用された後の新しいスタック:

  1. NEW は newIllegalArgumentExceptionをスタックに置きます[SomeIllegalArgumentException]
  2. DUP はそれを複製します[SomeIllegalArgumentException, SomeIllegalArgumentException]
  3. INVOKESPECIAL は一番上のオブジェクトからポップし、その <init> メソッドを呼び出して初期化します[SomeIllegalArgumentException] (init メソッドはスタックに戻すオブジェクトを返さないため、最初にオブジェクトを複製してスタックに保持する必要があります)
  4. ATHROW もう一方をスローします (初期化したものからの複製) []
于 2012-09-15T15:23:54.410 に答える
10

バイト コードでは、最初にクラスによってオブジェクトが作成され、次にそのオブジェクトに対してコンストラクターが呼び出されます。コンストラクターのシグネチャは、何かを返すため、 Vfor で終わります。voidこれは、コンストラクターが呼び出された後にスローできるように、オブジェクトへの元の参照のコピーをスタック (または変数) に保持する必要があることを意味します。

ところで、コンストラクター<init>の内部名は であり、静的初期化子コードの内部名は<clinit>

于 2012-09-15T15:22:48.147 に答える