CIL フォーマット
6F (T) / callvirt (method)
JVM フォーマット
B6 (uint16)/ invokevirtual (index)
B7 (uint16)/ invokespecial (index)
B9 (uint16) (uint8) 00 /
invokeinterface (index) (count) 0
※index には、メソッドを参照する ランタイム・コンスタント・プールのアドレスを指定する。
スタック
..., obj, arg1, arg2, ..., argn → ..., retVal (not always returned)
詳細
obj の実行時の型情報に基づいてメソッドを呼び出します。 virtualメソッドやインスタンス・メソッドに対して使用できます。
method はメタデータ・トークン(methodref もしくは methoddef)で表されます。 objのクラスの中でmethodと一致するメソッドがあれば、それが呼び出されます。 methodと一致するメソッドがない場合、スーパークラスが順に検索されます。 全てのスーパークラスでメソッドが見つからなければエラーとなります。
引数は左から右の順でスタックに積みます。 インスタンス・メソッドまたはvirtualメソッドを呼び出す場合、 全ての引数より前に、インスタンス参照(thisポインタ)をスタックに追加します。 呼ばれたメソッドでは、thisポインタが第0引数となり、 最初の引数が第1引数となります。
Exception
指定されたメソッドが obj のクラスや継承元のクラスで見つからない場合、 MissingMethodException が発生します。
obj が null である場合、NullReferenceException が発生します。
呼び出すメソッドに対するアクセス権が現在のメソッドに与えられていない場合、 SecurityException が発生します。