2017-07-20 18 views
-1

クラス内に2つの注釈があるとします。つまり、@ annotation_1と@ annotation_2は2つのインスタンスを作成したことを意味します。 ---エラーがあればこの文を修正してください!すべての注釈付きメソッドのインスタンスを作成せずに注釈付きメソッドを呼び出す

ここで、@ annotation_1または@ annotation_2で注釈付けされたすべてのメソッドを見つけました。これで、注釈付きメソッドごとの時間を測定する必要があります。

例えば、

 @annotation_1 
     Method1 
     { 
     ... 
     } 

     @annotation_2 
     Method2 
     { 
     ... 
     } 

     @annotation_1 
     Method3 
     { 
     ... 
     } 

     Method4 
     { 
     ... 
     } 

は今、私は、各のみ@ annotation_1でアノテートすべてのメソッドのために()nanoTimeを測定する必要が検討してください。だから私はその後、私は

Object obj = null; 
try { 
        startTime = System.nanoTime(); 
        m.invoke(obj); 
       }finally{ 
        stopTime = System.nanoTime(); 
        runTime = BigDecimal.valueOf(stopTime - startTime); 
       } 

を使用して注釈付きメソッドを呼び出した後、「m.invoke(OBJ)を使用して呼び出す

startTime = System.nanoTime(); 

によって起動する前にこの方法を取る時間を測定するために)(System.nanoTimeのを使用します"、@ annotation_1でアノテーションされた非静的メソッドにもアクセスしている可能性があるため、これを行う必要があります。つまり、Method1を呼び出してそれに対応するrunTimeを見つけ、次にMethod3を呼び出してから別々にrunTimeを見つける必要があります。

しかし、この呼び出しでは、@ annotation_1と@ annotation_2の2つのインスタンスが作成されることがわかりましたが、「annotation_1」注釈付きメソッドだけを考えています。

この呼び出しを取り除く方法を教えてください。特定の注釈で注釈付けされたメソッドを呼び出す別のメソッドがありますか?

事前に感謝します.... :)

編集:1

方法を取得するには:

for(Class<?> currentClass: args){ 
      List <Method> methods = Arrays.asList(currentClass.getDeclaredMethods()); 
      for (Method m: methods) { 

       Annotation[] annotations = m.getDeclaredAnnotations(); 

       for (Annotation annotation: annotations) { 

        if ((annotation instanceof annotation_1)) { 
        ... //code to find time by invoking method as given above 
        } else if ((annotation instanceof annotation_2)) { 
         ...//code to find time by invoking method as given above 
        } else 
        { 
         System.err.println("No. definition for annotation : @"+annotation); 
        } 

       } 
      } 
     } 

Argsのは、実行時のすべてのクラス名を取ります。

+0

メソッドを取得するために使用するコードを掲載してください。 –

+0

@ YazanJaber私は質問を編集しました。どうぞご覧ください... –

+0

ターゲットクラスのインスタンスを複数作成したくない場合は、オブジェクトの1つのインスタンスをキャッシュし、それを後のすべての呼び出しに使用できます? –

答えて

0

これらのメソッドを持つクラスのインスタンスが1つだけ必要です。その後、そのオブジェクトを使用してそれらのメソッドのいずれかを呼び出すことができます。

+0

実際に問題は、インスタンスを作成する必要がある非静的メソッドを呼び出す必要があるときです。これは、annotation_1とannotation_2の2つのインスタンスを作成します。したがって、m.invoke(obj)を使用すると、注釈付き注釈のインスタンスのみを作成する必要があり、両方を作成する必要がないため、両方のインスタンスを呼び出す必要がありません。 –

+0

実際にメソッドをグループ化することは私の問題ではありません。私はその特定の注釈付きメソッドのクラスのインスタンスだけを呼び出す必要があり、すべての注釈を呼び出す必要はありません。 –

+0

@ manoj、アノテーションが異なるメソッドに注釈を付けると、インスタンスが作成されません。 newキーワードを使用するとき、またはインスタンスを作成するときにClass.newInstance()メソッドを使用するとき。正確に1つのインスタンスを作成しているインスタンスを作成するときに、アノテートされるメソッドの数は関係ありません。 –

関連する問題