Я новичок в Javassist и пробую несколько уроков. Я понимаю, что Javassist помогает манипулировать байт-кодом и помогает достичь структурного отражения. Как уже упоминалось в вики (http://en.wikipedia.org/wiki/Javassist),, я считаю, что она имеет поддержку для достижения отражения.
Я пытаюсь провести базовую оценку, чтобы понять, сколько времени потребуется java-рефлексу для вызова метода, и сколько времени потребуется javassist. В процессе предположим, что у меня есть класс:
public class Addition {
public int add(int a, int b){
return a+b;
}
}
Теперь, используя API Java-отражения, я бы использовал следующий код для вычисления того, сколько времени потребуется для вызова 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.
Но, в отличие от API Java-отражения, я не могу найти метод вызова в API-интерфейсе ctMethod javassist. Означает ли это, что мне нужно создать дублированный метод и вызвать исходный метод, как описано в: http://www.ibm.com/developerworks/java/library/j-dyn0916/index.html.
Я не уверен, что это правильный путь.
Я что-то упустил?