我是Javassist的新手,尝试了几个教程。我理解Javassist帮助操作字节码并帮助实现结构反射。正如wiki (http://en.wikipedia.org/wiki/Javassist)中提到的,我相信它确实支持实现反射。
我正在尝试做一个基本的评估,以了解java反射调用一个方法需要多长时间,而javassist将花费多少时间。在这个过程中,假设我有一个类:
public class Addition {
public int add(int a, int b){
return a+b;
}
}现在,使用反射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对象,并存储我将要阅读的类。我还可以使用declaredmethods获取所有的仲裁方法,并将其存储在一个ctMethod变量中。
但是,与不同,我无法在ctMethod api中找到一个调用方法。这是否意味着,我必须创建一个重复的方法,并且必须调用原始方法,如:http://www.ibm.com/developerworks/java/library/j-dyn0916/index.html中所解释的那样。
我不确定这是否是正确的方法。
我是不是遗漏了什么?
发布于 2012-02-13 03:39:22
Javassist用于以编程方式更改现有类或生成新类。它的反射功能在现有类的转换过程中使用,以了解正在转换的类的详细信息。
javassist的反射功能类似于反射api的反射功能,但是javassist无法调用方法(当然,除非生成调用这些方法的代码)。
您可以做的是使用javassist来转换ReflectionClass的主要方法,这样就可以动态地添加计时代码,即您可以用它构建一个原始分析器。然后,您可以将计时代码排除在ReflectionClass源文件之外,并在运行时将其添加到JVM中。
另一种方法是像您所说的那样生成一个“调用100个对象”的类,但是计时并不是很有趣,因为它的运行速度和普通的java字节码一样快。
https://stackoverflow.com/questions/9187233
复制相似问题