0

私は Javassist の初心者で、いくつかのチュートリアルを試しています。Javassist がバイトコードを操作し、構造的なリフレクションを実現するのに役立つことを理解しています。ウィキ ( 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 の進め方がわかりません。つまり、

ctclass オブジェクトを作成し、読み取るクラスを保存します。また、getdeclaredmethods を使用してすべての宣言済みメソッドを取得し、それを ctMethod 変数に格納することもできます。

しかし、javassist の ctMethod API には、Java リフレクション API とは異なり、invoke メソッドが見つかりません。これは、 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 に答える