1

私はjavassistを使用しており、ロードタイム/ランタイムでインターフェースやその他のものを生成しています。

インターフェースのメソッドを (バイトコードの invokeinterface で) 呼び出すには、いくつかのパラメーターを提供する必要があります: indexbyte1、indexbyte2、count、および 0 ( http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2 から)。 doc6.html )。

呼び出したい抽象メソッド (CtMethod) が既にあるのですが、そのカウントを計算するにはどうすればよいですか?

たとえば、http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc6.htmlでは、「invokeinterface 命令のカウント オペランドは、引数値の数の測定値を記録します。 long 型または double 型の引数値はカウント値に 2 単位寄与し、その他の型の引数は 1 単位寄与します。この情報は、選択したメソッドの記述子から取得することもできます。冗長性は歴史的なものです。 "

しかし、「カウントオペランドはゼロであってはならない符号なしバイトです」とも言います。

呼び出したい抽象メソッドにパラメーターがない場合、カウントは 0 になります!? ただし、count を 0 にすることはできません。メソッドの記述子は ()V です。

助言がありますか?

4

2 に答える 2

1

javaassist の詳細はわかりませんが、count はメソッドを呼び出すために必要なスタック領域のサイズであると想定しています。この場合は、パラメーターの前にスタックにプッシュされる「this」変数用のスペースを指定する必要があります (invokeinterface を実行しているため)。この場合、パラメータのないメソッドのカウントは 1 になります。

于 2011-03-28T02:55:02.343 に答える
0

インスタンス メソッドは、呼び出しのサブジェクトのスタック ワードを本質的に消費します。

于 2011-03-29T14:30:33.423 に答える