注釈(メタデータとも呼ばれます)は、コードに情報を追加するための正式な方法を提供し、後の瞬間にこのデータを非常に便利に使用できるようにします。
1。基本的な構文
Java SE5には、3つの組み込み標準注釈があります
@Override:現在のメソッド定義がスーパークラスのメソッドを上書きすることを示します。間違ったスペルを誤って綴る場合、またはメソッドの署名が上書きの方法と一致しない場合、コンパイラはエラーメッセージを発行します。
@Deprecated:プログラマが注釈付き要素を使用する場合、コンパイラは警告メッセージを発行します
@supperesswarnings:不適切なコンパイラ警告メッセージを閉じます。
Java SE5には、4つの組み込みメタアノテーションがあります
@Target:この注釈をどこで使用できるかを示します。可能なElementTypeパラメーターは次のとおりです。
1)コンストラクター:コンストラクターのステートメント
2)フィールド:ドメイン宣言(列挙インスタンスを含む)
3)local_variable:ローカル変数宣言
4)方法:メソッドステートメント
5)パッケージ:パッケージステートメント
6)パラメーター:パラメーター宣言
7)タイプ:クラス、インターフェイス(注釈タイプを含む)、または列挙宣言
@retention:注釈情報を保存するレベルを示します。オプションの保持ポリティパラメーターは次のとおりです。
1)出典:注釈はコンパイラによって破棄されます
2)クラス:アノテーションはクラスファイルで利用できますが、VMによって廃棄されます
3)ランタイム:VMはランタイム中に注釈も保持するため、注釈情報は反射メカニズムを通して読み取ることができます。
@documented:Javadocにこの注釈を含めてください
@Inherited:ほとんどの場合、サブクラスが親クラスで注釈を継承できるようにし、プログラマーは主に独自の注釈を定義し、それらを処理するために独自のプロセッサを書きます。
usecase.java
パッケージcom; java.lang.annotation.ElementTypeをインポートします。 java.lang.annotation.retentionをインポートします。 java.lang.annotation.retentionPolicyをインポートします。 java.lang.annotation.targetをインポートします。 @target(elementtype.method)//アノテーションが適用される場所を定義するために使用します。これは、ソースコード(クラス)またはランタイヤー(ランタイム)@retention(retentionPolicy.runtime)public @interface usecase {public int id( public string description()デフォルト「説明なし」; } passwordutils .javaパッケージcom;パブリッククラスのpasswordutils {@usecase(id = 47、description = "パスワードには少なくとも1つの数値を含める必要があります")public boolean validatePassword(){return true; } @usecase(id = 48)public string encryptpassword(string password){return password; } @usecase(id = 49、description = "jong_cai")public void showname(){system.out.println( "jong_cai"); }}
2。注釈プロセッサを書き込みます
注釈を読むツールがない場合、注釈は注釈よりも有用ではありません。注釈を使用する過程で、重要な部分は、注釈プロセッサを作成および使用することです。 Java SE5は反射メカニズムAPIを拡張して、プログラマーがそのようなツールを構築するのに役立ちます。同時に、プログラマーがJavaソースコードを注釈で解析するのに役立つ外部ツールが提供されます。以下は非常にシンプルなアノテーションプロセッサです。これを使用して、PasswordUtilsクラスを読み取り、反射メカニズムを使用して@usecaseタグを見つけます。 ID値のセットを提供し、Passwordutilsで見つかったユースケースと、欠落しているユースケースをリストします。
usecasetracker.javaパッケージcom; java.lang.reflt.methodをインポートします。 java.util.arraylistをインポートします。 java.util.collectionsをインポートします。 java.util.listをインポートします。 public class usecasetracker {public static void trackusecases(list <integer> list、class <? if(us!= null){system.out.println( "found use case:" + us.id() + "" + us.description()); list.remove(new Integer(us.id())); }} for(int i:list){system.out.println( "警告:不足ユースケース - " + i); }} public static void main(string [] args){list <integer> list = new arraylist <integer>(); collections.addall(リスト、47,48,49,50,51); TrackUseCases(リスト、passwordutils.class); }}
このプログラムでは、2つの反射方法を使用しています:getDeclaredMethods()とgetAnnotation()。どちらもAnnotatedElementインターフェイスに属します(クラス、方法、フィールド、およびその他のクラスはこのインターフェイスを実装しています)。 getAnnotation()メソッドは、指定されたタイプの注釈オブジェクトであるusecaseを返します。注釈付きメソッドにタイプの注釈がない場合、ヌル値を返します。次に、ID()と説明()メソッドを呼び出すことにより、返されたUSECaseオブジェクトから要素の値を抽出します。 encryptPassWord()メソッドは、注釈時に説明値を指定しないため、プロセッサが対応するアノテーションを処理すると、説明()メソッドのデフォルト値は説明()メソッドで取得されます。
注釈はJavaの世界に広がっています。時間がある場合は、この簡単な注釈記事を書いてください。注釈の紹介です。私はあなたがレンガを投げて一緒に学ぶことができることを願っています...
ナンセンスの話をやめると、練習は一番下の行です。
3。例
最初に注釈の概念について話してから、独自の注釈を設計する方法について話しましょう。
まず、JDKに付属のJava.lang.Annotationパッケージで、次のソースファイルを開きます。
ソースファイルターゲット
@documented @retention(retentionPolicy.runtime)@target(elementType.annotation_type)public @interfaceターゲット{elementType [] value(); @documented @retention(retentionPolicy.runtime)@target(elementType.annotation_type)public @interfaceターゲット{elementType [] value(); }
@Interfaceはキーワードです。注釈を設計する場合、タイプは@interfaceとして定義する必要があり、クラスまたはインターフェイスのキーワードを使用することはできません(Sunは少しケチだと思いますが、インターフェイスに似ているように見えます)。
ソースファイル保持。Java
@documented @retention(retentionPolicy.runtime)@target(elementType.annotation_type)public @interface retention {retentionPolicy value(); } @documented @retention(retentionPolicy.runtime)@target(elementType.annotation_type)public @interface retention {retentionPolicy value(); }
これを見た後、あなたは曖昧で、あなたが何について話しているのかわからないかもしれません。心配しないで、見てください。上記のファイルは、2つのフィールドLestentionPolicyとElementTypeを使用しており、これらは2つのJavaファイルであると推測できます。実際、これら2つのファイルのソースコードは次のとおりです。
ソースファイルretentionPolicy.java
public Enum retentionPolicy {source、class、runtime} public Enum retentionPolicy {source、class、runtime}これは、ソース、クラス、ランタイム、つまり3つの値、つまり3つの値を備えた列挙タイプです。
ソースとは、注釈型情報がプログラムソースコードでのみ保持されることを意味します。ソースコードがコンパイルされている場合、注釈データは消え、コンパイルされた.classファイルに保持されません。
クラスとは、注釈型情報がプログラムソースコードに保持されることを意味し、コンパイルされた.classファイルにも保持されます。実行すると、この情報は仮想マシン(JVM)にロードされません。注釈タイプの保持値を設定しない場合、システムのデフォルト値はクラスであることに注意してください。
3番目はランタイムです。つまり、情報はソースコードに保持され、。クラスファイルがコンパイルされ、この情報は実行中にJVMにロードされます。
たとえば、@Overrideの保持がソースに設定されている場合、コンピレーションが成功した場合、これらのチェック情報は必要ありません。それどころか、 @deprecatedの保持はランタイムに設定されています。つまり、コンピレーション中に使用される方法を警告することに加えて、実行時にメソッドが非推奨かどうかを確認することもできます。
ソースファイルElementType.java
public Enum elementType {type、field、method、method、constructor、local_variable、annotation_type、パッケージ} public enum elementType {type、field、method、parameter、constructor、local_variable、annotation_type、パッケージ} targetターゲットのElementTypeを使用して、使用できる要素を指定するために使用されます。説明しましょう:タイプ(タイプ)、フィールド(属性)、メソッド(メソッド)、パラメーター(パラメーター)、コンストラクター(コンストラクター)、local_variable(ローカル変数)、annotation_type、パッケージ(パッケージ)。
さらに、@Target自身も自分自身を宣言するために自分自身を使用し、Annotation_Typeでのみ使用できることが1のソースコードから見ることができます。
注釈型が@Targetを使用する要素を指定していない場合、任意の要素で使用でき、ここの要素は上記の8型を指します。
いくつかの正しい例を挙げましょう:
@target(elementType.Method)
@target(value = elementType.method)
@target(elementType.Method、elementType.Constructor)
詳細については、Javadocドキュメントを参照してください
ソースファイルはすべて@documentedを使用します。 @Documentedの目的は、この注釈型情報をJavaapi説明ドキュメントに表示できるようにすることです。追加されていない場合、Javadocを使用してAPIドキュメントを生成する場合、このタイプによって生成された情報は見つかりません。
別のポイントは、注釈データをサブクラスに継承する必要がある場合、注釈タイプ@inheritedを使用することです。
以下は、4つのファイルで構成されるデザインの最も単純な注釈の例です。
Description.java
パッケージlight.javaeye.com; java.lang.annotation.documentedをインポートします。 java.lang.annotation.ElementTypeをインポートします。 java.lang.annotation.retentionをインポートします。 java.lang.annotation.retentionPolicyをインポートします。 java.lang.annotation.targetをインポートします。 @target(elementtype.type)@retention(retentionPolicy.runtime)@documented public @interface description {string value(); }パッケージlight.javaeye.com; java.lang.annotation.documentedをインポートします。 java.lang.annotation.ElementTypeをインポートします。 java.lang.annotation.retentionをインポートします。 java.lang.annotation.retentionPolicyをインポートします。 java.lang.annotation.targetをインポートします。 @target(elementtype.type)@retention(retentionPolicy.runtime)@documented public @interface description {string value(); }
注:すべての注釈は、インターフェイスjava.lang.Annotationを自動的に継承するため、他のクラスやインターフェイスを継承することはできません。
最も重要な点は、注釈型にパラメーターを設定する方法です。
まず、パブリックまたはデフォルトのアクセス権のみを使用して、それを変更することができます。たとえば、string値();ここで、メソッドをデフォルトのデフォルトタイプに設定します。
第二に、パラメーターメンバーは、バイト、ショート、チャー、int、long、float、double、boolean、および文字列、列挙、クラス、注釈などのデータ型の8つの基本データのみを使用できます。たとえば、string値();ここのパラメーターメンバーは文字列です。
第三に、パラメーターメンバーが1つしかない場合、パラメーター名を「値」に設定し、その後ブラケットを追加することをお勧めします。例:上記の例には、パラメーターメンバーが1つしかありません。
name.java
パッケージlight.javaeye.com; java.lang.annotation.documentedをインポートします。 java.lang.annotation.ElementTypeをインポートします。 java.lang.annotation.retentionをインポートします。 java.lang.annotation.retentionPolicyをインポートします。 java.lang.annotation.targetをインポートします。 //ここの@Targetは@descriptionとは異なり、パラメーターメンバーも@Target(elementType.Method)@retention(retentionPolicy.runtime)@documented public @interface name {string riginine();文字列community(); }パッケージlight.javaeye.com; java.lang.annotation.documentedをインポートします。 java.lang.annotation.ElementTypeをインポートします。 java.lang.annotation.retentionをインポートします。 java.lang.annotation.retentionPolicyをインポートします。 java.lang.annotation.targetをインポートします。 //ここの@Targetは@descriptionとは異なり、パラメーターメンバーも@Target(elementType.Method)@retention(retentionPolicy.runtime)@documented public @interface name {string riginine();文字列community(); }
javaeyer.java
パッケージlight.javaeye.com; @description( "Javaeye、Be Best Software Development Exchange Community")Public Class Javaeyer {@name(origine = "Founder:Robbin"、community = "Javaeye")public string getName(){return null; } @Name(Origine = "Founder:Jiangnan Baiyi"、community = "Springside")public String getname2(){return "idsの2つのIDを借りて、この例を書くことを許してください!"; }} package lighter.javaeye.com; @description( "Javaeye、Be Best Software Development Exchange Community")Public Class Javaeyer {@name(origine = "Founder:Robbin"、community = "Javaeye")public string getName(){return null; } @Name(Origine = "Founder:Jiangnan Baiyi"、community = "Springside")public String getname2(){return "idsの2つのIDを借りて、この例を書くことを許してください!"; }}Extract Javaeyer情報を実行できるTestAnnotationクラスを書く
パッケージlight.javaeye.com; java.lang.reflt.methodをインポートします。 java.util.hashsetをインポートします。 java.util.setをインポートします。パブリッククラスのtestAnnotation { / ***著者ライター*注:詳細については、annotation api* / public static void main(string [] args)throws {string class_name = "lighter.javaeye.com.javaeer"; class test = class.forname(class_name); method [] method = test.getMethods(); boolean flag = test.isannotationpresent(description.class); if(flag){説明des =(説明)test.getannotation(description.class); System.out.println( "description:"+des.Value()); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- hashset <method>; system.out.println(+name.community()}} javaeye.com; annotation api*/ public static void main(string [] args)スロー例外{string class_name = "lighter.javaeye.com.javaeyer"; class test = class.forname(class_name); method [] method = test.getMethods(); boolean flag = test.isannotationpresent(description.class); if(flag){説明des =(説明)test.getannotation(description.class); System.out.println( "description:"+des.Value()); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- { boolean otherflag [i] isannotation(name.class);実行結果:
説明:Javaeye、最高のソフトウェア開発交換コミュニティの創設者:Robbin Created Community:Javaeye Founder:Javaeye Created Community:Springside