0

我是 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 反射 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。IE,

我将创建一个 ctclass 对象并存储我要阅读的类。我还可以使用 getdeclaredmethods 获取所有声明的方法并将其存储在 ctMethod 变量中。

但是,与java反射api不同,我在javassist的ctMethod api中找不到调用方法。这是否意味着,我必须创建一个重复的方法,并且必须按照以下说明调用原始方法:http: //www.ibm.com/developerworks/java/library/j-dyn0916/index.html

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

我错过了什么吗?

4

1 回答 1

1

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

javassist 的反射能力与反射 api 的类似,但 javassist 无法调用方法(当然,除非您生成调用这些方法的代码)。

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

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

于 2012-02-13T03:39:22.500 回答