ASM ガイドでは、コンストラクターについて説明しています。
package pkg; public class Bean { private int f; public int getF() { return this.f; } public void setF(int f) { this.f = f; } }
Bean クラスには、コンパイラによって生成されるデフォルトのパブリック コンストラクタもあります。これは、プログラマが明示的なコンストラクタを定義していないためです。このデフォルトの public コンストラクターは として生成され
Bean() { super(); }
ます。このコンストラクタのバイトコードは次のとおりです。ALOAD 0 INVOKESPECIAL java/lang/Object <init> ()V RETURN
this
最初の命令は、オペランド スタックをプッシュします。2 番目の命令は、この値をスタックからポップし、クラス<init>
で定義されたメソッドを呼び出します。Object
これはsuper()
呼び出し、つまりスーパークラスのコンストラクターへの呼び出しに対応しObject
ます。ここで、コンストラクターはコンパイル済みクラスとソース クラスで異なる名前が付けられていることがわかります。コンパイル済みクラスではコンストラクターは常に名前が付けられますが、ソース クラスではコンストラクターが<init>
定義されているクラスの名前が付けられます。最後に、最後の命令が呼び出し元に戻ります。
this
コンストラクターの最初の命令の前に、JVMは の値をどのように認識していますか?