1。RetentionPolicy.Source:注釈はソースファイルにのみ保持されます。 Javaファイルがクラスファイルにコンパイルされると、注釈は放棄されます。
2。RetentionPolicy.class:アノテーションはクラスファイルに保持されますが、JVMがクラスファイルをロードすると放棄されます。これがデフォルトのライフサイクルです。
3。RetentionPolicy.Runtime:アノテーションはクラスファイルに保存されるだけでなく、JVMがクラスファイルをロードした後も存在します。
これらの3つのライフサイクルは、Javaソースファイル(.javaファイル)--->。クラスファイル---->メモリ内のbytecodeに対応しています。
では、適切な注釈のライフサイクルをどのように選択しますか?
まず第一に、ライフサイクルの長さのソース<class <runtimeを明確にする必要があります。したがって、前者が行動できる場所では、後者が行動できます。一般に、実行時にアノテーション情報を動的に取得する必要がある場合は、ランタイム注釈のみを使用できます。コンパイル時にいくつかの前処理操作を実行する場合(バターナイフなど)、補助コードの生成など、クラスアノテーションを使用できます。 @Overrideや@SuppressWarningsなどのチェック操作のみを行う場合は、ソースアノテーションを使用できます。
以下は、ランタイム注釈の簡単なアプリケーションです。
注釈を取得します
パッケージ、クラス、フィールド、方法から取得できるリフレクションを通じてランタイム注釈を取得する必要があります。基本的な方法は同じです。いくつかの一般的な方法は次のとおりです。
/***指定されたタイプの注釈を取得*/public <a ends annotation> a getAnnotation(class <a> annotationType);/***すべての注釈を取得します。この要素では、ある場合はtrueを返します。そうでなければ、false*/public boolean isannotationpresent(class <?extends annotation> annotationType);/***メソッドのパラメーターのすべてのアノテーションを取得*/public Annotation [] [] getParameterAnnotations();
これらの関数を使用するには、最初に反射、クラス、フィールド、メソッドなどを介して対応する要素を取得する必要があります。
カスタムアノテーション
カスタムアノテーションを使用する簡単な方法を見てみましょう。ここでは、最初に3つのランタイム注釈を定義します。
//該当するクラス、インターフェイス(アノテーションタイプを含む)またはenum @retention(retentionPolicy.runtime)@target(elementType.type)public @interface classinfo {string value(); } //適用されるフィールド属性には、enum constants @retention(retentionPolicy.runtime)@target(elementType.field)public @interface fieldinfo {int [] value(); } // applaint method @retention(retentionPolicy.runtime)@target(elementType.method)public @interface methodinfo {string name()default "long"; string data(); int age()デフォルト27; }これらの3つの注釈は、異なる要素に適用でき、すべて異なる属性があります。注釈を使用する場合、これらの属性値を設定する必要があります。
これらの注釈を使用するために別のテストクラスを定義します。
/***ランタイムアノテーションをテスト*/@classInfo( "Test class")パブリッククラスtestruntimeannotation {@fieldInfo(value = {1、2})public string filedInfo = "filedInfo";@fieldinfo(value = {10086})public int i = 100; @methinfo(name = "blue stiting" getMethodinfo(){return testruntimeannotation.class.getSimplename();}}}まだ使用するのは非常に簡単です。最後に、コードで注釈情報を取得する方法を見てみましょう。
/***ランタイムアノテーションをテスト*/private void _testruntimeannotation(){stringbuffer sb = new stringbuffer(); class <?> cls = testruntimeannotation.class; constructor <? ").Append("/n "); classinfo classinfo = cls.getannotation(classinfo.class); if(classinfo!= null){sb.append(modifier.tostring(cls.getModifiers()))。 ").Append(classinfo.value())。append("/n/n ");} sb.append(" field annotation: ")。("/n "); fields = cls.getDeclaredsield(); {sb.append(modifier.tostring(field.getModifiers()))。append( "").append(field.getType()。getSimplename())。 ").Append(arrays.toString(fieldinfo.value()))。 (MethodInfo!= null){sb.append(modifier.tostring(method.getModifiers()))。 ").Append("/n "); sb.append(" name: ").append(methodinfo.name())。 ").Append(MethodInfo.age())。append("/n ");}} system.out.print(sb.tostring());}操作は、反射を通じて対応する要素を取得し、要素の注釈を取得し、最後に注釈の属性値を取得するために行われます。
出力を見てみましょう。ここでは、電話に直接表示します。
要約します
上記は、Java Language Annotationの基本概念のすべての詳細な説明であり、すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!