概要
Javaは、Java Annotationとしても知られるバージョン1.5に注釈を導入しました。注釈は、ソースコードで直接使用できる構文メタデータの一種であり、クラス/メソッド/変数/パラメーター/パッケージ名などを注釈付けすることができます。 Javadocタグとは異なり、コンパイラはクラスファイルを生成するときに注釈コードを保持できます。同時に、実行時間プロセス中に注釈を使用するために、Java仮想マシンは注釈を維持し、注釈に関する関連情報を反射を通じて取得できます。
組み込みの注釈
実際、@Override、 @deprecatedなどの注釈にしばしば遭遇します。これらはすべてJDKに組み込まれた注釈です。まず、Javaの主な内蔵注釈が何であるかを見てみましょう。
•Javaコードに作用する注釈
◦@Overrideメソッドが書き換えメソッドかどうかを確認します。このメソッドが親クラスまたは実装されたインターフェイスで見つからない場合、コンパイルエラーが発生します。
◦@メソッドまたはクラスが破棄されることを非推奨マーク。クラスまたはメソッドを使用すると、コンピレーションプロセスが警告します。
◦@suppresswarningsアノテーションされたパラメーターに関する警告を無視するようコンパイラに通知する
◦@Safevarargsは、一般的なパラメーターを含むメソッドまたはコンストラクターの呼び出しに関する警告を無視します。1.7に注釈が追加されました
◦@functionalinterface宣言されたインターフェイスが関数インターフェイスとして使用されることを示します。 1.8が注釈を追加しました
•他の注釈で作られた注釈は、メタアノテーション(メタアノテーション)と呼ばれます
◦@retentionは、注釈付き注釈が使用されるとき(つまり、注釈が保持されるとき)を指定します
■ソースコードのみで保持およびコンピレーション中に破棄されます(RetentionPolicy.Runtime)
■アノテーションは、コンピレーション中にクラスファイルに保存され、クラスファイルがロードされたときに無視されます(retentionPolicy.class)
■アノテーションは、クラスファイルがロードされたときに読み取られます。つまり、操作中に注釈が利用可能です。注釈は、反射(retentionPolicy.runtime)を通じて得ることができます
◦@documentedは、Javadocを生成するときに、注釈付きの注釈がJavadocドキュメントに書き込まれることを示します。
◦@ターゲット注釈付き注釈の範囲を指定します■elementType.Type:クラス、インターフェイス(注釈型を含む)または列挙宣言■elementType.fieldを記述するために使用されます。 Constructor■elementType.Local_Variable:ローカル変数の記述に使用■elementType.Annotation_Type:アノテーションの記述に使用■elementType.Package:パッケージを説明するために使用されます
◦ @継承は、注釈が継承されていることを示します。つまり、@inheritedによって変更されたアノテーションタイプがクラスに使用される場合、注釈は変更されたクラスのサブクラスにも作用します。
◦@repealableは、注釈付き注釈を同じオブジェクトに複数回適用できることを示します。 1.9に注釈が追加されました
カスタムアノテーション
私は上記の多くの注釈について言及しました、そして、誰もがメタアノテーションに焦点を当てています。注釈をカスタマイズするとき、通常、メタアノテーションを使用して支援します。カスタムアノテーション形式は、public @interface annotation name {definition body}です。 @interfaceカスタムアノテーションを使用する場合、java.lang.annotation.annotationインターフェイスが自動的に継承されます。注釈をカスタマイズする場合、他の注釈やインターフェイスを継承することはできません。注釈で宣言された方法は、実際にはコメントパラメーターです。メソッドの名前はパラメーターの名前であり、戻り値タイプはパラメーターのタイプです。パラメーターのデフォルト値は、デフォルトから宣言できます。
カスタムアノテーションはシンプルです。@interfaceを使用して、次のように注釈を定義します。
@retention(retentionPolicy.runtime)@target(elementType.type)@documentedpublic @interface classinfo {string著者()デフォルト "wang";文字列date();文字列コメント();} ClassInfoと呼ばれるカスタム注釈。 @retentionによると、この注釈は常に存在することを知ることができます。つまり、この注釈はプログラムが実行されているときにまだ有効です。 @target(elementType.Type)とは、ClassINFOアノテーションがクラス、インターフェイス、または列挙宣言に作用することを意味します。 @documented
手順ClassINFO情報は、Javadocドキュメントに書き込むことができます。
カスタム注釈のいくつかの注釈パラメーターを見てみましょう。 3つの注釈パラメーターがあります。 Author Annotationパラメーター、デフォルト値はWang、他の2つのパラメーターにはデフォルト値がないなど、アノテーションパラメーターをデフォルトで設定できます。
別のカスタム注釈を見てみましょう。
@retention(retentionPolicy.runtime)@target(elementType.Method)public @interface methodinfo {string description()default "no description";文字列date();}このカスタムアノテーションMethodInfoはメソッドに基づいて機能し、この注釈はプログラムが実行されているときにも存在します。その中には2つの注釈パラメーターがあります。
パラメーターの定義(メソッド定義)に注釈を付けるには、2つのAccess Rights Modifiers PublicまたはDefaultのみを使用できます。パラメータータイプは、次のタイプをサポートしています。
•8つの基本的なデータ型(BYTE、INT、短い、長い、フロート、ダブル、チャー、ブール)
•文字列タイプ
•クラスタイプ
•列挙タイプ
•注釈タイプ
•上記のすべてのタイプの配列
注釈の使用
上記の2つの注釈に加えて、フィールドスコープの注釈が追加されました。
@retention(retentionPolicy.runtime)@target(elementType.field)public @interface fieldinfo {string type();文字列名();}カスタムアノテーションでデフォルト値が宣言されていない場合、カスタムアノテーションを使用するときにこれらのパラメーターを割り当てなければなりません。そうしないと、コンパイラはエラーを報告します。
注釈で使用されるコードをご覧ください。
@classinfo(著者= "wang"、date = "2016/9/13"、comments = "annotation demo")public class annotationdemo {@fieldinfo(type = "public"、name = "firstfield")public int firstfield; @fieldinfo(type = "private"、name = "secondfield")private string secondfield; @methodinfo(description = "annotationdemo"、name = "firstmethod")public void firstmethod(string value){system.out.printf( "first method ofering"); } @methodinfo(description = "annotationdemo"、name = "secondmethod")private void secondmethod(){system.out.printf( "first method ofering"); }}注釈情報を取得します
注釈情報を取得するには、最初にプログラムの実行中に注釈が存在することを確認する必要があります。したがって、通常、カスタムアノテーションに@retention(RetentionPolicy.Runtime)メタアノテーションを追加します。このようにして、プログラムの実行中に、リフレクションを通じていくつかの注釈情報を取得できます。リフレクションに関する指示については、この記事を見ることができます。
public class annotationTest {public static void main(string [] args){resolveclassannotationinfo(annotationdemo.class); Resolvefieldannotationinfo(annotationdemo.class); Resolvemethodannotationinfo(annotationdemo.class); } private static void resolveclassannotationinfo(class <?> clz){//このクラスにclassinfo annotationがあるかどうかを判断します。 system.out.println(classinfo.author() + "" + classinfo.comments() + "" + classinfo.date()); }} private static void resolvefieldannotationinfo(class <?> clz){field [] fields = clz.getDeclaredfields(); for(field:fields){if(field.isannotationpresent(fieldinfo.class)){fieldinfo fieldinfo =(fieldinfo)field.getannotation(fieldinfo.class); system.out.println(fieldinfo.type() + "" + fieldinfo.name()); }}} private static void resolvemethodannotationinfo(class <?> clz){method [] methods = clz.getDeclaredMethods(); for(method method:method){if(method.isannotationpresent(methodinfo.class)){methodinfo methodinfo =(methodinfo)method.getannotation(methodinfo.class); system.out.println(methodinfo.name() + "" + methodinfo.description()); }}}}クラスなどでフィールド/メソッドを取得し、getAnnotation()またはgetAnnotation()を介して関連する注釈を取得するためのリフレクション。特定の注釈を取得することにより、特定の情報を取得できます。
実行結果の出力は次のとおりです。
図1の操作結果図
要約します
Javaの初心者や、特定の経験を持つJava開発者でさえ、Javaの注釈への暴露が少ない場合があります。実際には、注釈はめったに使用されませんが、コードでそれらをよく見ることがよくあります。この記事は、注釈の簡単な紹介であり、少なくともコードレベルでは、読むことはできません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。