我是Javassist的新手,并尝试了一些教程。我知道Javassist有助于操纵字节码并帮助实现结构反射。正如wiki(http://en.wikipedia.org/wiki/Javassist)中所提到的,我相信它确实有助于实现反思。
我正在尝试进行基本评估,以了解java反射调用方法需要多长时间以及javassist需要多长时间。在这个过程中,假设我有一个班级:
public class Addition {
public int add(int a, int b){
return a+b;
}
}
现在,使用java reflection 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变量中。
但是,与java reflection api不同,我在javassist的ctMethod api中找不到一个invoke方法。这是否意味着,我要创建一个重复的方法,并且必须调用原始方法,如:http://www.ibm.com/developerworks/java/library/j-dyn0916/index.html中所述。
我不确定这是否是正确的方法。
我错过了什么吗?
答案 0 :(得分:1)
Javassist用于更改现有类或以编程方式生成新类。它的反射功能在现有类的转换过程中使用,以找出有关正在转换的类的详细信息。
javassist的反射功能类似于反射api的反射功能,但javassist无法调用方法(除非你生成调用这些方法的代码)。
你可以做的是使用javassist转换ReflectionClass的主方法,以便动态添加定时代码,即你可以用它构建一个原始的分析器。然后你可以将定时代码从ReflectionClass的源文件中删除,并在将类加载到JVM中时在运行时添加它。
另一种方法是生成一个“调用100个对象”的类,但是计时它不会很有趣,因为它的运行速度与普通的java字节码一样快。