вызвать метод с использованием Javassist - PullRequest
0 голосов
/ 08 февраля 2012

Я новичок в Javassist и пробую несколько уроков. Я понимаю, что Javassist помогает манипулировать байт-кодом и помогает достичь структурного отражения. Как уже упоминалось в вики (http://en.wikipedia.org/wiki/Javassist),, я считаю, что она имеет поддержку для достижения отражения.

Я пытаюсь провести базовую оценку, чтобы понять, сколько времени потребуется java-рефлексу для вызова метода, и сколько времени потребуется javassist. В процессе предположим, что у меня есть класс:

public class Addition {

  public int add(int a, int b){
     return a+b;
  }
}

Теперь, используя API Java-отражения, я бы использовал следующий код для вычисления того, сколько времени потребуется для вызова 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-отражения, я не могу найти метод вызова в API-интерфейсе ctMethod javassist. Означает ли это, что мне нужно создать дублированный метод и вызвать исходный метод, как описано в: http://www.ibm.com/developerworks/java/library/j-dyn0916/index.html.

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

Я что-то упустил?

1 Ответ

1 голос
/ 13 февраля 2012

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

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

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

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

...