使用Javassist调用方法

时间:2012-02-08 02:55:06

标签: javassist

我是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中所述。

我不确定这是否是正确的方法。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

Javassist用于更改现有类或以编程方式生成新类。它的反射功能在现有类的转换过程中使用,以找出有关正在转换的类的详细信息。

javassist的反射功能类似于反射api的反射功能,但javassist无法调用方法(除非你生成调用这些方法的代码)。

你可以做的是使用javassist转换ReflectionClass的主方法,以便动态添加定时代码,即你可以用它构建一个原始的分析器。然后你可以将定时代码从ReflectionClass的源文件中删除,并在将类加载到JVM中时在运行时添加它。

另一种方法是生成一个“调用100个对象”的类,但是计时它不会很有趣,因为它的运行速度与普通的java字节码一样快。