私は Javassist の初心者で、いくつかのチュートリアルを試しています。Javassist がバイトコードを操作し、構造的なリフレクションを実現するのに役立つことを理解しています。ウィキ ( http://en.wikipedia.org/wiki/Javassist ) で言及されているように、リフレクションを実現するためのサポートがあると思います。
Java リフレクションがメソッドを呼び出すのにかかる時間と javassist がかかる時間を理解するために、基本的な評価をしようとしています。その過程で、クラスがあると仮定します。
public class Addition {
public int add(int a, int b){
return a+b;
}
}
ここで、Java リフレクション API を使用して、次のコードを使用して、100 個のオブジェクトを呼び出すのにかかる時間を計算します。
import java.lang.reflect.*;
public class ReflectionClass {
/**
* @param args
*/
public static void main(String[] args) {
int numberOfObjects = 10000;
double start,time;
try {
Class cls = Class.forName("Addition");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod(
"add", partypes);
Addition methobj = new Addition();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
start = System.currentTimeMillis();
for(int i=0;i<numberOfObjects;i++){
Object retobj= meth.invoke(methobj, arglist);
Integer retval = (Integer)retobj;
System.out.println(retval.intValue());
}
time = System.currentTimeMillis() - start;
System.out.println("Method call for "+numberOfObjects +" objects is::"+time +" milliseconds");
}
catch (Throwable e) {
System.err.println(e);
}
}
}
さて、javassist の進め方がわかりません。つまり、
ctclass オブジェクトを作成し、読み取るクラスを保存します。また、getdeclaredmethods を使用してすべての宣言済みメソッドを取得し、それを ctMethod 変数に格納することもできます。
しかし、javassist の ctMethod API には、Java リフレクション API とは異なり、invoke メソッドが見つかりません。これは、 http ://www.ibm.com/developerworks/java/library/j-dyn0916/index.html で説明されているように、重複したメソッドを作成し、元のメソッドを呼び出す必要があることを意味します。
これが正しい方法であるかどうかはわかりません。
何か不足していますか?