вызвать метод с помощью Javassist

Я новичок в Javassist и пробую несколько руководств. Я понимаю, что Javassist помогает манипулировать байт-кодом и помогает добиться структурного отражения. Как упоминалось в вики (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.

Но, в отличие от API отражения java, я не могу найти метод вызова в ctMethod API javassist. Означает ли это, что я должен создать повторяющийся метод и вызвать исходный метод, как описано в: http://www.ibm.com/developerworks/java/library/j-dyn0916/index.html.

Я не уверен, что это правильный путь.

Я что-то упускаю?


person Ashok    schedule 08.02.2012    source источник


Ответы (1)


Javassist используется для изменения существующих классов или создания новых программным путем. Его отражающие возможности используются во время преобразования существующих классов, чтобы узнать подробности о трансформируемом классе.

Возможности отражения javassist аналогичны возможностям API отражения, но у javassist нет возможности вызывать методы (если, конечно, вы не сгенерируете код, который вызывает эти методы).

Что вы можете сделать, так это использовать javassist для преобразования основного метода вашего ReflectionClass таким образом, чтобы код синхронизации добавлялся динамически, т.е. вы могли бы создать с ним примитивный профилировщик. Затем вы можете исключить временной код из исходного файла ReflectionClass и добавить его во время выполнения, когда класс загружается в JVM.

Другим подходом было бы создание класса, который, как вы говорите, «вызывает 100 объектов», но время было бы не очень интересным, потому что он будет работать так же быстро, как обычный байт-код java.

person user1205938    schedule 13.02.2012