2011-09-02 11 views
12

現在、私はちょうどJavaバイトコードを使用するプロジェクトに入っています。 「DUP」を行う必要がありますなぜここ新しいインスタンスを作成するときにDUPを行う理由

NEW <MyClass> 
DUP 
INVOKESPECIAL <MyClass.<init>> 

:私は通常、新しいクラスのインスタンスを作成し、それに対してメソッドを呼び出したとき、バイトコードは次のようになることを参照してください? VM Specから、「オペランドスタックのトップ値を複製し、その重複した値をオペランドスタックにプッシュする」という記述を得る。しかし、なぜここでオペランドスタックのトップ値を複製する必要がありますか?ありがとう。

答えて

19

INVOKESPECIALはNEWによって作成された値をオペランドスタックから消費するため、実際にこの値を使用する必要があるため、参照は事前に複製されています。

関連する問題