JAva注記の動作原理と使用シーン(Demo小記)

6856 ワード

注釈とは?
注釈は、メタデータ、すなわちデータを記述するデータである.したがって,注釈はソースコードのメタデータであるといえる.
なぜ注釈を導入するのですか?
XMLは、Annotationを使用する前(使用後でも)に記述メタデータに広く適用されている.いつからか、XMLのメンテナンスがますます悪化していることに、アプリケーション開発者やアーキテクチャ担当者が気づきました.XMLのようにコードと緩やかに結合された(場合によっては完全に分離された)コード記述ではなく、コードと密接に結合されたものを使用することを望んでいます.Googleで「XML vs.annotations」を検索すると、この問題に関する議論がたくさん見られます.最も興味深いのは、XML構成がコードと構成を分離するために導入されたことです.上記の2つの観点は疑問に思うかもしれませんが、両者の観点は循環を構成しているようですが、それぞれメリットとデメリットがあります.次に、この2つの違いを一例で理解します.アプリケーションに多くの定数やパラメータを設定したい場合は、XMLは特定のコードに接続されないため、良い選択です.ある方法をサービスとして宣言したい場合は、Annotationを使用するほうがいいです.この場合、注釈と方法が緊密に結合する必要があるため、開発者もそれを認識する必要があります.もう1つの重要な要因は、Annotationがメタデータを標準的に記述する方法を定義することである.これまで、開発者は通常、独自の方法でメタデータを定義していました.たとえば、interfaces、コメント、transientキーワードなどのタグを使用します.各プログラマは、Annotationのような標準的な方法ではなく、独自の方法でメタデータを定義します.現在、多くのフレームワークはXMLとAnnotationの2つの方法を組み合わせて使用され、両者のメリットとデメリットをバランスさせています.
Annotationはどのように働いていますか?カスタムAnnotationの作成方法
このセクションを説明する前に、まずAnnotationのサンプルコードAnnotationsSampleをダウンロードすることをお勧めします.zip .ダウンロード後、あなたが慣れているIDEに置くと、これらのコードはAnnotationメカニズムをよりよく理解するのに役立ちます.Annotationの作成は非常に簡単で、Annotationの定義をインタフェースの定義と比較することができます.2つの例を見てみましょう.1つは標準的な注釈@Overrideであり、もう1つはユーザー定義注釈@Todoです.
例:@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public@interface Override{}@Override注釈については、何もしていないのではないかと疑問に思うかもしれませんが、親に同名の関数があることをどのようにチェックしているのでしょうか.もちろん、驚かないでください.私はあなたをからかっています.@Override注記の定義は、これだけのコードではありません.この部分は重要で、Annotationsはメタデータにすぎず、ビジネスロジックとは関係ありません.理解するのはちょっと難しいですが、そうです.Annotationsにビジネスロジックが含まれていない場合は、これらのロジックを実現する人が必要です.メタデータのユーザーがこのことをします.Annotationsは、定義された属性(クラス/メソッド/パッケージ/ドメイン)の情報のみを提供します.Annotationsのユーザ(同様にいくつかのコード)は、これらの情報を読み取り、必要な論理を実現する.Javaの注釈Annotations(@Overrideなど)を使用すると、JVMはバイトコードレベルで動作するユーザーです.ここまでは、アプリケーション開発者は、カスタム注釈を制御したり使用したりすることはできません.そこで、カスタムAnnotationsの作成方法について説明します.カスタムAnnotationsを作成するポイントを1つずつ説明します.上記の例では、いくつかの注釈が注釈に適用されているのを見ます.XMLは、Annotationを使用する前(使用後でも)に記述メタデータに広く適用されている.いつからか、XMLのメンテナンスがますます悪化していることに、アプリケーション開発者やアーキテクチャ担当者が気づきました.XMLのようにコードと緩やかに結合された(場合によっては完全に分離された)コード記述ではなく、コードと密接に結合されたものを使用することを望んでいます.Googleで「XML vs.annotations」を検索すると、この問題に関する議論がたくさん見られます.最も興味深いのは、XML構成がコードと構成を分離するために導入されたことです.上記の2つの観点は疑問に思うかもしれませんが、両者の観点は循環を構成しているようですが、それぞれメリットとデメリットがあります.次に、この2つの違いを一例で理解します.アプリケーションに多くの定数やパラメータを設定したい場合は、XMLは特定のコードに接続されないため、良い選択です.ある方法をサービスとして宣言したい場合は、Annotationを使用するほうがいいです.この場合、注釈と方法が緊密に結合する必要があるため、開発者もそれを認識する必要があります.もう1つの重要な要因は、Annotationがメタデータを標準的に記述する方法を定義することである.これまで、開発者は通常、独自の方法でメタデータを定義していました.たとえば、interfaces、コメント、transientキーワードなどのタグを使用します.各プログラマは、Annotationのような標準的な方法ではなく、独自の方法でメタデータを定義します.現在、多くのフレームワークはXMLとAnnotationの2つの方法を組み合わせて使用され、両者のメリットとデメリットをバランスさせています.>Annotationはどのように働いていますか?カスタムAnnotationの作成方法>>このセクションを説明する前に、まずAnnotationのサンプルコードAnnotationsSampleをダウンロードすることをお勧めします.zip .ダウンロード後、あなたが慣れているIDEに置くと、これらのコードはAnnotationメカニズムをよりよく理解するのに役立ちます.Annotationの作成は非常に簡単で、Annotationの定義をインタフェースの定義と比較することができます.2つの例を見てみましょう.1つは標準的な注釈@Overrideで、もう1つはユーザー定義注釈@Todoです.>>例:@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public@interface Override{}@Override注釈については、何もしていないのではないかと疑問に思うかもしれませんが、親に同名の関数があることをどのようにチェックしているのでしょうか.もちろん、驚かないでください.私はあなたをからかっています.@Override注記の定義は、これだけのコードではありません.この部分は重要で、Annotationsはメタデータにすぎず、ビジネスロジックとは関係ありません.理解するのはちょっと難しいですが、そうです.Annotationsにビジネスロジックが含まれていない場合は、これらのロジックを実現する人が必要です.メタデータのユーザーがこのことをします.Annotationsは、定義された属性(クラス/メソッド/パッケージ/ドメイン)の情報のみを提供します.Annotationsのユーザ(同様にいくつかのコード)は、これらの情報を読み取り、必要な論理を実現する.Javaの注釈Annotations(@Overrideなど)を使用すると、JVMはバイトコードレベルで動作するユーザーです.ここまでは、アプリケーション開発者は、カスタム注釈を制御したり使用したりすることはできません.そこで、カスタムAnnotationsの作成方法について説明します.カスタムAnnotationsを作成するポイントを1つずつ説明します.上記の例では、いくつかの注釈が注釈に適用されているのを見ます.J2SE5.0バージョンjava.lang.annotationは4つのメタ注釈を提供し、他の注釈に特化しています:@Documented–注釈はJavaDocに含まれますか@Retention–この注釈@Targetはいつ使用しますか?–注記を使用する場所@Inherited–子クラスがその注記を継承できるかどうか
@Documented–javaドキュメントに注釈情報を追加するかどうかを示す簡単なAnnotationsタグ注釈.
@Retention–注釈のライフサイクルを定義します.
RetentionPolicy.SOURCE–コンパイル時に破棄されます.これらの注記は、コンパイルが終了すると意味がなくなり、バイトコードに書き込まれません.@Override,@SuppressWarningsはいずれもこのような注釈に属する.RetentionPolicy.CLASS–クラスのロード時に破棄されます.バイトコードファイルの処理に役立ちます.注記のデフォルトでは、この方法が使用されます.RetentionPolicy.RUNTIME–常に破棄されず、実行期間も注釈を保持するため、反射メカニズムを使用して注釈の情報を読み取ることができます.カスタム注釈では、通常この方法が使用されます.
@Target–注釈がどこで使用されるかを示します.
明確に指摘しなければ、この注釈はどこにでも置くことができます.以下に、使用可能なパラメータを示します.説明する必要があるのは、属性の注釈は互換性があり、7つの属性に注釈を追加し、1つの属性だけを除外したい場合は、targetを定義してすべての属性を含む必要があります.ElementType.TYPE:クラス、インタフェース、またはenum宣言ElementTypeを記述する.FIELD:インスタンス変数ElementTypeを記述するために用いる.METHOD ElementType.PARAMETER ElementType.CONSTRUCTOR ElementType.LOCAL_VARIABLE ElementType.ANNOTATION_TYPEもう一つの注釈ElementType.PACKAGE javaファイルのpackage情報を記録するために使用
@Inherited–コメントとサブクラスの関係を定義します
では、注釈の内部はどのように定義されているのでしょうか.Annotationsは、基本タイプ、String、列挙タイプのみをサポートします.アノテーション内のすべてのプロパティはメソッドとして定義され、デフォルト値を指定できます.
Demoの例では、UserAnnotation注記クラスを定義します.
@Target(value = { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
    public int id() default 0;  
       public String name() default ""; 
       public int age() default 18; 
       public String gender() default "M";
}

[@target]この注釈はどのクラスのjavaメンバーに注釈を指定し、注釈ターゲットがどのようなものであるかを指定します@Targetのソースコード
@Documented
 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) //      ,          ,              
 public @interface Target {     
ElementType[] value(); //       value={...} 
}
 public enum ElementType {     
     TYPE,  //  ( )     
    FIELD, //     ,    ,         
     METHOD, //       
     PARAMETER, //          
    CONSTRUCTOR, //            
    LOCAL_VARIABLE, //            
   ANNOTATION_TYPE,//     (           )                    
    PACKAGE, //         
    TYPE_PARAMETER, //   ,  
    TYPE_USE //      
 }

[@Retention]は、注釈が実行されている状態を表します.言い換えれば、注釈がどのような状態で実行されるかを表します.
**  @Retention   **
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {    
RetentionPolicy value();
}
public enum RetentionPolicy {    
SOURCE, //      ,    
CLASS, //            
RUNTIME //     
}

注釈の定義ができました.どのように使いますか.以下のようにします.
public class TestMain{ 
@UserAnnotation(age=20,gender="F",id=2014,name="zhangsan")//      
   private Object obj;   
   public static void main(String[] args) throws Exception  {     
        Filed objField = TestMain.class.getField("obj");     
       UserAnnotation ua = objField.getAnnotation(UserAnnotation.class);//    ,                
 System.out.println(ua.age()+","+ua.gender()+","+ua.id()+","+ua.name());    //***       ,  Object     User ,               
       TestMain tm = new TestMain();    
      objFiled.set(tm,new User(ua.age(),ua.gender(),ua.id(),ua.name())); //   ,        obj,                  
   }
}