2016-05-07 6 views
2

コントロールの流れをデバッグする/表示することができるかどうか知りたいのですが、アノテーションに対してどのコードが実行されるのですか。私が理解しようとしていることは、以下のようなものです:アノテーションの仕組みの追跡 - アノテーションに対して実行されるコード

(春Frameworkの注釈に固有ではない、他の注釈可能)

は、コードスニペットを考えてみましょう:

@Autowired(required=true) 
private JPADBAccess jPADBAccess; 

私が何を理解したいですアクション/コードはアノテーションに対して実行されますか?見ることができますか?

私は、どのように簡単に注釈をつけて作業を行うのかを理解するのが難しいです。実際に何らかの作業を行うコードがいくつかあるはずです。注釈はちょうどインターフェイス(@interface ..)に似ていますが、実際のコードはどこにありますか?

+2

注釈は単なるメタデータです。彼らは自分では何もしません。何かが、 'Class'、' Method'、 'Field'といった何かを解析して、アノテーションデータを抽出し、それを使って何らかの目標を達成する必要があります。 Springでは、 '@ Autowired'は' AutowiredAnnotationBeanPostProcessor'によって処理されます。 –

+2

注釈の付いたコードが実行されていません。それは他の無関係のコードで、あなたのオブジェクトをリフレクションを通して検査します。 – zapl

+0

https://docs.oracle.com/javase/tutorial/java/annotations/ –

答えて

0

注釈の「範囲」は、その位置に基づいています。例えば、この注釈は、クラス全体に影響を与えます。

@SuppressWarnings("unused") 
public class Foo{ 
    private Object anUnusedField; 
    private Object anotherUnusedField; 
    private void anUnusedMethod(Object unusedParameter){} 
    /* 
    * Here, the compiler will suppress all "the private field/method 
    * Foo.[insert name here] is unused" warnings. It will warn about 
    * the unusedParameter of anUnusedMethod 
    */ 
} 

この1つは、特定のフィールドに影響を与えます。

public class Foo{ 
    private Object anUnusedField; 
    @SuppressWarnings("unused") private Object anotherUnusedField; 
    private void anUnusedMethod(Object unusedParameter){} 
    /* 
    * Here, the compiler won't tell that anotherUnusedField is not used. 
    * But it'll tell that anUnusedField isn't used, anUnusedMethod isn't 
    * called and unusedParameter isn't used in anUnusedMethod 
    */ 
} 

この1つは、特定の方法に影響を与えます。

public class DifferentFoo{ 
    @SuppressWarnings("unused") private void anUnusedMethod(){} 
    private void anotherUnusedMethod(){} 
    /* 
    * Here, the compiler will only tell that anotherUnusedMethod isn't 
    * called 
    */ 
} 

はまた、あなたができることに注意してくださいすべてのアノテーションをすべて使用していません。たとえば、次の内容は無効です:

@Override protected Object someFieldFromTheSuperclass; 
// Doesn't compile. Fields can't be overriden like methods 
1

オープンソースライブラリを扱っている場合は、ソースコードを見て、アノテーションがどこで使われているかを調べることができます。

注釈が実際にどのように使用されているかを確認したい場合は、デバッグすることもできます。ランタイム注釈については

は、アプリケーションをデバッグし、デバッガがそれをサポートしている場合getAnnotationgetDeclaredAnnotationsなどのようなクラスメソッドにブレークポイントを設定しようとすることができます(Eclipseの1が行うように)、あなたはまた、条件付きブレークポイントを使用することができます例えばgetAnnotationのパラメータに正しいタイプがある場合は、ブレークポイントで停止してください。

注釈がコンパイル時に処理されても機能しません。その場合はdebugging the annotation processorで同じことを試し、注釈をロードするメソッドにブレークポイントを設定することもできます。