2012-02-08 5 views
0

私はJavassistの初心者で、チュートリアルをほとんど試していません。私は、Javassistがバイトコードを操作するのに役立ち、構造的な反映を達成するのに役立つことを理解しています。 wiki(http://en.wikipedia.org/wiki/Javassist)で述べたように、私はそれが反映を達成するためのサポートを持っていると思います。Javassistを使ってメソッドを呼び出す

私は基本的な評価をして、Javaリフレクションがメソッドを呼び出すのにどれだけの時間が必要か、javassistがどのくらいの時間を要するかを理解しようとしています。プロセスでは、私はクラスがあると仮定:

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); 
    } 
    } 

} 
:JavaのリフレクションAPIを使用して、今すぐ

public class Addition { 

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

を、私は、100個のオブジェクトを呼び出すために取られるhowmuch時間を計算するために、次のコードを使用します

今、javassistをどのように進めるべきか分かりません。すなわち、

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

しかし、JavaリフレクションAPIとは異なり、私はjavassistのctMethod apiでinvokeメソッドを見つけることができません。つまり、重複したメソッドを作成して、http://www.ibm.com/developerworks/java/library/j-dyn0916/index.htmlで説明されているように、元のメソッドを呼び出す必要があります。

これが正しい方法であるかどうかはわかりません。

何か不足していますか?

答えて

1

Javassistは、既存のクラスを変更したり、プログラムによって新しいクラスを生成するために使用されます。そのリフレクション機能は、既存のクラスの変換時に使用され、変換されるクラスに関する詳細がわかります。

javassistのリフレクション機能はリフレクションAPIのリフレクション機能と似ていますが、javassistでは(もちろんそれらのメソッドを呼び出すコードを生成しない限り)メソッドを呼び出す方法はありません。

javassistを使用してReflectionClassのメインメソッドを変換し、タイミングコードが動的に追加されるようにします。つまり、プリミティブプロファイラを使用してビルドすることができます。その後、タイミングコードをReflectionClassのソースファイルから除外し、クラスがJVMにロードされるときに実行時に追加することができます。

もう1つのアプローチは、あなたが言うように '100個のオブジェクトを呼び出す'クラスを生成することですが、それは通常のJavaバイトコードと同じ速さで実行されるので面倒ではありません。

関連する問題