事前定義された注釈ので0使用、関連するメタアノテーションを読み取ります
その他の注意事項(カスタム注釈での使用のメタアノテーションに必要)にjava.lang.annotationの提供4元のノート、特別な注意事項:
-ノートはのJavaDocに含まれるかどうか@Documented
@Retention -アノテーションを使用します
@Target -何の注釈に使用されている
@Inherited -コメントサブクラスの継承を許可するかどうか
。注釈ライフサイクルの定義- 1)保持@
コンパイル時に破棄:●RetentionPolicy.SOURCE。コンパイラの終わりにこれらのアノテーションはもはや意味を持つことになります、彼らは、バイトコードを記述しません。@Override、@SuppressWarningsは、このようなコメントに属します。
●RetentionPolicy.CLASS:廃棄されたクラスのロード。便利なバイトコードファイル。デフォルトでは、この方法を使用NOTE
●RetentionPolicy.RUNTIMEは:あなたは注釈情報を読み取るためにリフレクションを使用できるようにも、ノートを保つ実行を破棄されることはありません。注釈私たちのカスタムは、一般的にこのように使用します。
2)ターゲット-注釈がここで使用されていることを示しています。デフォルト値は注釈がどこかに使用されていることを示す、任意の要素です。使用可能なパラメータは、のElementType含む
●ElementType.CONSTRUCTORを:コンストラクタを記述するために使用され
●ElementType.FIELD:(列挙例を含む)のメンバー変数、オブジェクト、プロパティ
●ElementType.LOCAL_VARIABLE:記述するために使用されるローカル変数
●ElementType.METHODを:記述する方法
●ElementType.PACKAGE:説明するためのパッケージ
記述するために使用されるパラメータ:●ElementType.PARAMETER
●ElementType.TYPEを:(注釈のタイプを含む)インタフェースをクラスを記述するために、または列挙宣言
3)@文書化 - 。簡単な注釈は、注釈情報は、Javaのドキュメントを追加するかどうかを示す、ノートをマーク。
4)継承@ -音符とサブクラスとの間の関係を定義
@Inheritedメタアノテーションを継承@、マーカー注釈であるインデックス付きの特定のタイプが継承されている記載されています。修飾@Inherited注釈型を用いたものをクラスに使用される場合、このアノテーションは、このクラスのサブクラスで使用されています。
1.カスタムクラスのノートには、いくつかのルールが書かれました
1.注釈タイプは、すべての注釈が自動的に継承java.lang.Annotationこのインタフェース、@interfaceとして定義され、別のクラスまたはインタフェースを継承して行くことはできません。
2.パラメータのメンバーが唯一の公共またはデフォルト(デフォルト)を使用することができます。この2つのアクセスは、変更
3.会員は、唯一のタイプのショートバイト、CHAR、INT、の基本的なパラメータを使用長い、フロート、ダブル、ブール8つの基本データ型と文字列、列挙型、クラス、注釈および他のデータ型を、そしてこのタイプのいくつかの配列。
加えて、オブジェクトの注釈を取得するための他の方法がないので、情報注釈付きクラスメソッドやフィールドの4、Java技術の反射によって注釈オブジェクトを取得する必要がある
。5.ノートはメンバーが定義されていない可能性がありますが,,上のこの無益なコメント
PS:メタアノテーションを使用するカスタム注釈が必要
2.例
AnimalName.java
パッケージcom.xiaojian.basics.annotation。 / ** *動物種 * / インポートjava.lang.annotation.Documented。 輸入java.lang.annotation.Retention。 輸入java.lang.annotation.Target; 輸入 静的java.lang.annotation.ElementType.FIELD。 輸入 静的java.lang.annotation.RetentionPolicy.RUNTIME。 @Target(FIELD) @Retention(RUNTIME) @Documented パブリック @ インタフェースAnimalName { 文字列値()デフォルト「」; }
AnimalColor.java
パッケージcom.xiaojian.basics.annotation。 輸入java.lang.annotation.Documented; 輸入java.lang.annotation.Retention。 輸入java.lang.annotation.Target; 輸入 静的java.lang.annotation.ElementType.FIELD。 輸入 静的java.lang.annotation.RetentionPolicy.RUNTIME。 / ** *動物の色 * / @Target(FIELD) @Retention(RUNTIME) @Documented パブリック @ インタフェースAnimalColor { / ** *色の列挙 * / パブリック 列挙カラー{黒、白、灰色、多彩}。 色animalColor()デフォルトの色を白色。 }
AnimalMaster.java
パッケージcom.xiaojian.basics.annotation。 輸入java.lang.annotation.Documented; 輸入java.lang.annotation.Retention。 輸入java.lang.annotation.Target; 輸入 静的java.lang.annotation.ElementType.FIELD。 輸入 静的java.lang.annotation.RetentionPolicy.RUNTIME。 / ** *動物の所有者 * / @Target(FIELD) @Retention(RUNTIME) @Documented パブリック @ インタフェースAnimalMaster { int型の ID()デフォルト -1 ; 文字列名()デフォルト「」; 文字列のアドレス()デフォルト「」; }
AnimalInfoUtil.java
パッケージcom.xiaojian.basics.annotation。 インポートをjava.lang.reflect.Field; / ** *バック動物情報 * / パブリック・ クラスAnimalInfoUtil { 公共の 静的な 無効 GETINFO(クラス<?> clazz){ StrAnimalNameのStringBuilder = 新新のStringBuilder( "動物種:" ); StrAnimalColorのStringBuilder = 新新のStringBuilder( "アニマルカラー:" ); StrAnimalProviderのStringBuilder = 新新のStringBuilder( "所有者情報:" ); フィールド[]フィールド = clazz.getDeclaredFields()。 用(フィールドフィールド:フィールド){ 場合(field.isAnnotationPresent(AnimalName クラス)){ 動物名動物動物 =(動物の名前)field.getAnnotation(動物の名前。クラス)。 strAnimalName.append(animalAnimal.value())。 System.out.println(strAnimalName)。 } そう であれば(field.isAnnotationPresent(AnimalColor。クラス)){ AnimalColor animalColor =(AnimalColor)field.getAnnotation(AnimalColor。クラス)。 strAnimalColor.append(animalColor.animalColor()のtoString())。 System.out.println(strAnimalColor)。 } そう であれば(field.isAnnotationPresent(AnimalMaster。クラス)){ AnimalMaster animalMaster =(AnimalMaster)field.getAnnotation(AnimalMaster。クラス)。 strAnimalProvider.append( "[ID:" + animalMaster.id()+ "所有者名:" + animalMaster.name()+ "住所:" + animalMaster.address()+ "]" ); System.out.println(strAnimalProvider)。 } } } }
テスト:
パッケージcom.xiaojian.basics.annotation。 / ** * Testクラス * / パブリック クラスのテスト{ 公共 静的 ボイドメイン(文字列[]引数){ AnimalInfoUtil.getInfo(動物。クラス); } }
戻り値:
動物種:犬
アニマルカラー:ブラック
所有者情報:[ID: 1、所有者名:暁明、住所:杭州、浙江省XXXXXXXX]
リファレンス[リンク]
https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html