Javaカスタムアノテーション
Java Annotationsは、コンピレーションとランタイム中にいくつかのツールを解析して使用するために使用され、説明と構成関数として機能するコードに添付されたメタ情報です。
注釈は、コードの実際のロジックに影響を与えず、補助的な役割を果たします。 java.lang.Annotationパッケージに含まれています。
1。メタノート
メタアノテーションとは、注釈の注釈を指します。 4つのタイプを含む:@retention @target @document @inherited。
1.1。 @retention:注釈の保持戦略を定義します
@retention(retentionPolicy.source)//アノテーションはソースコードにのみ存在し、@retention(retentionPolicy.class)//デフォルト保持ポリシーが使用されていません。アノテーションはクラスのByteCodeファイルに存在しますが、実行時には取得することはできません。 @retention(retentionPolicy.runtime)//アノテーションはクラスバイトコードファイルに存在し、実行時に反射を通じて取得できます。
注釈クラス:
@retention(retentionPolicy.runtime)//アノテーションはクラスのbytecodeファイルに存在します。 @target({elementType.field、elementType.Method}は実行時に反射を通じて取得できます//アノテーションのターゲット**フィールドの範囲と列挙定数/メソッド @ドキュメント//アノテーションがJavadoc public @interfaceフィールドに含まれることを示します。 * field name* @return*/string name()default "";/*** editable* @return*/boolean editable()default true;/*** listに表示するかどうか* @return*/** ***フィールド説明* @return*/string説明()エンティティクラス:
public class anno {@fieldmeta(id = true、name = "serial number"、order = 1)private int id; @fieldmeta(name = "name"、order = 3)private string name; @fieldmeta(name = "age"、order = 2)private age; {return id;} public void setid(int id){this.id = id;} public string getname(){return name;} public void setname(string name){this.name = name;} public int getage(){return age;} public void setage(int age){this.age;}}}}}注釈のヘルプクラスを取得します:
public class sortablefield {public sortablefield(){} public sortablefield(fieldmeta meta、field field){super(); this.meta = meta; this.field = field; this.name = field.getName(); thispe = field.getType(); Meta; this.name = name; this.type = type;} private fieldmeta meta; private field field; private string name; private class <?> ytemeta(){return meta;} public void setmeta(fieldmeta(fieldmeta( getname(){return name;} public void setname(string name){this.name = name;} public class <?> getType(){return inpy;} public void setType(class <?実行時に注釈を取得するには、最初にベースクラスを作成します。
public class parent {private class <t> entity; public parent(){init();}@suppresswarnings( "unchecked")public list <Sortablefield> init(){list <SortableField> list = new ArrayList <sortablefield>();/** getclass()。このクラス(クラス、インターフェイス、プリミティブタイプ、またはvoid) *で、そしてそれをparameterizedTypeに変換します。 。 * getActualTyPearguments()このタイプの実際の型パラメーターを表すタイプオブジェクトの配列を返します。 * [0]は、この配列の最初のものです。 。 *要するに、スーパークラスの実際のタイプの一般的なパラメーターを取得することです。 。 */entity =(class <t>)((parameterizedType)this.getClass()。getGenericsuperclass())。getActualTyPearguments()[0];フィールドですが、継承されたフィールド* entity.getFields()は含まれません。クラスのオブジェクト*で表されるクラスまたはインターフェイスのすべてのアクセス可能なパブリックフィールドのみを返しますgetDeclared **()メソッドは、すべてのアクセス許可を使用してフィールド、メソッドなどを返します。 * api * */field [] fields = entity.getDeclaredfields(); //(フィールドF:フィールド){// fieldmeta fieldmeta meta = f.getAnnotation(fieldmeta.class); if(meta!= null){sortable sf = casitable sf = fectable field(f returtable sf); fem、add(sf);オブジェクトメソッドで表されるクラスまたはインターフェイスのパブリックメソッド[] methods = entity.getMethods(); for(メソッドM:メソッド){fieldmeta meta = m.getannotation(fieldmeta.class); if(meta!= null){sortablefield sf = new sortablefield(meta、m.getname()、m.getreturntype()、list.add(sf);}}}} sorting // collections.sort(list、new fieldsortcom()); collections.sort(list、new Comparator <Sortable>(){@OverridePublic int Compare(Sortable Field S1、Sortable Field S2){return S1.getMeta()。 s1.getname()。比較(s2.getname()); //比較にも比較}});} return list;}}}基本クラスを継承するサブクラスを作成します。
パブリッククラスの子供は親を拡張します<anno> {}テストクラス:
public class testannotation {@suppresswarnings({"unchecked"、 "rawTypes"})public static void main(string [] args){parent c = new child(); list <Sortable> list = c.init(); "+l.getName()+"/tフィールドタイプ: "+l.getType()+"/t annotation name: "+l.getmeta()。name()+"/t annotation説明: "+l.getmeta()。説明();}}}}}}///////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //////////////////////////////////////////////////
1。注釈の実用的な原則:
JDK5.0は注釈機能を提供し、開発者が独自の注釈タイプを定義および使用できるようにします。この関数は、注釈タイプと注釈宣言を記述する構文、注釈を読み取るAPI、注釈を使用して変更するクラスファイル、および注釈処理ツールを記述する構文で構成されています。
注釈はコードのセマンティクスに直接影響しませんが、プログラムのツールまたはクラスライブラリと見なすことができます。次に、実行中のプログラムセマンティクスに何らかの影響を与えます。
注釈は、ランタイム中の反射メカニズムを通じてさまざまな方法で読むことができます。
2。@Overrideアノテーション:
Java.lang
コメントタイプオーバーライド
@target(value = method)
@retention(value = source)
public @Interface Overrideとは、メソッド宣言がスーパークラスの別のメソッド宣言をオーバーライドすることを意味します。メソッドがこの注釈タイプで注釈を付けたが、スーパークラスメソッドをオーバーライドしない場合、コンパイラはエラーメッセージを生成します。
@Overrideアノテーションは、サブクラスが親クラスの対応する方法をオーバーライドする必要があることを意味します。
オーバーライドは、注釈を識別するために使用されるマーカー注釈です。注釈名自体は、ツールプログラムに提供される情報を表します。
@overrideアノテーションを使用した例を次に示します。
クラスA {プライベート文字列ID; a(string id){this.id = id; } @Override public String toString(){return id; }}3。@Deprecated Annotation:
Java.lang
コメントタイプは非推奨です
@documented
@retention(value = runtime)
public @Interface @DepRecatedで注釈が付けられたPublic Quartatedプログラム要素は、通常は危険であるか、より良いオプションがあるため、そのような要素を使用することを思いとどまらせます。コンパイラは、承認されていないプログラム要素を使用したり、承認されていないコードで書き直しを実行したりした場合に警告します。
@Deprecated Annotation Lepresentationメソッドは推奨されません。
非推奨はマーカー注釈です。
@deprecated Annotationを使用した例を次に示します。
クラスA {プライベート文字列ID; a(string id){this.id = id; } @deprecated public void execute(){system.out.println(id); } public static void main(string [] args){a a = new a( "a123"); a.execute(); }}4。@SuppressWarningsアノテーション:
Java.lang
コメントTypeSuppressWarnings
@target(value = {type、field、method、parameter、constructor、local_variable})
@retention(value = source)
public @Interface SuppressWarningsは、指定されたコンパイラ警告がコメント要素(およびそのコメント要素に含まれるすべてのプログラム要素)に表示されないことを示しています。特定の要素で表示されていない一連の警告は、要素で表示されていないすべての警告のスーパーセットであることに注意してください。たとえば、警告を解除するためにクラスにコメントし、別の警告を解消する方法に注釈を付けた場合、この方法では両方の警告が撮られません。
スタイルに応じて、プログラマーは常に最も内側のネストされた要素でこの注釈を使用する必要があり、そこで使用された場合にのみ機能します。特定の方法で警告を発したい場合は、クラスの代わりにメソッドにコメントする必要があります。
@suppresswarningsアノテーションは抑制警告を示します。
@suppresswarningsアノテーションを使用した例を次に示します。
@suppresswarnings( "unchecked")public static void main(string [] args){list list = new ArrayList(); list.add( "abc");}5。カスタムアノテーション:
@interfaceを使用してカスタムアノテーションを使用すると、java.lang.annotation.annotationインターフェイスが自動的に継承され、その他の詳細はコンパイラによって自動的に完了します。注釈を定義する場合、他の注釈やインターフェイスを継承することはできません。
最も簡単なコメントをカスタマイズします:
public @interface myannotation {} custom Custom Annotation:public class annotationTest2 {@myannotation public void execute(){system.out.println( "method"); }} 5.1。変数を追加:
public @interface myannotation {string value1();} custom notations:public class annotationtest2 {@myannotation(value1 = "abc")public void execute(){system.out.println( "method"); }}アノテーションで使用される属性名が値の場合、属性インターフェイスは、属性の割り当て時に属性の名前を指定せずに直接記述できます。予期しない変数の値の名前を除き、すべての変数名はname = valueを使用して割り当てる必要があります。
5.2。デフォルト値の追加:
public @interface myannotation {string value1()default "abc";}5.3。多変量使用列挙:
public @interface myannotation {string value1()default "abc"; myenum value2()デフォルトmyenum.sunny;} enum myenum {sunny、rainy}カスタムアノテーションを使用してください:
public class annotationTest2 {@myannotation(value1 = "a"、value2 = myenum.sunny)public void execute(){system.out.println( "method"); }} 5.4。配列変数:
public @interface myannotation {string [] value1()default "abc";}カスタムアノテーションを使用してください:
public class annotationTest2 {@myannotation(value1 = {"a"、 "b"})public void execute(){system.out.println( "method"); }}6.注釈の範囲を設定します。
@documented
@retention(value = runtime)
@target(value = annotation_type)
public @Interface保持は、注釈タイプの注釈を保持する期間を示します。コメントタイプの宣言に保持注釈が存在しない場合、保持ポリシーはデフォルトで保持policy.classになります。
ターゲットメタコメントは、メタコメントタイプがコメントに直接使用される場合にのみ有効です。メタコメントタイプが別のコメントタイプのメンバーとして使用される場合、それは無効です。
public enum retentionpolicy
Enum <RetentionPolicy>コメント保持ポリシーを拡張します。この列挙タイプの定数は、コメントを維持するためのさまざまな戦略を説明しています。保持メタコメントタイプで使用され、注釈が保持される期間を指定します。
クラス
コンパイラはクラスファイルにコメントを記録しますが、VMは実行時にコメントを維持する必要はありません。
ランタイム
コンパイラはクラスファイルにコメントを記録し、VMは実行時にコメントを保持するため、反射的に読むことができます。
ソース
コンパイラを破棄するコメント。 @retention Annotationは、注釈を定義する際にコンパイラに注釈保持ポリシーを提供できます。
クラス保持ポリシーに属する注釈は@SuppressWarningsであり、.Classファイルに保存されません。
6.1。カスタム注釈での使用の例:
@retention(retentionPolicy.class)public @interface myannotation {string [] value1()default "abc";}7。リフレクションを使用してランタイム保持ポリシーの注釈情報を読む例:
Java.lang.Reflect
インターフェイスAnnotatedElement
すべての既知の実装クラス:
AccessibleObject、クラス、コンストラクター、フィールド、メソッド、パッケージは、現在このVMで実行されているプログラムのコメントされた要素を表します。このインターフェイスにより、コメントの反射的な読み取りが可能になります。このインターフェイスのメソッドによって返されるすべてのコメントは、不変でシリアル化可能です。発信者は、割り当てられた配列列挙されたメンバーのアクセサーによって返された配列を変更できます。これは、他の発信者によって返される配列に影響を与えません。
このインターフェイスのメソッドが、このVMでアクセスできないクラスを参照する割り当てられたクラスメンバーを含むコメント(直接的または間接的に)を返す場合、返されたコメントで関連するクラスによって返されたメソッドを呼び出すことでクラスを読み込もうとする場合、TypenotPresentExceptionになります。
isannotationpresent
boolean isannotationpresent(class <?extends annotation> annotationclass)は、指定されたタイプのコメントがこの要素に存在する場合にtrueを返し、それ以外の場合はfalseを返します。この方法は、主にタグコメントへのアクセスを容易にするために設計されています。
パラメーター:
AnnotationClass-アノテーションタイプに対応するクラスオブジェクト
戻る:
指定されたコメントタイプのコメントがこのオブジェクトに存在する場合、trueを返す、それ以外の場合はfalse
投げる:
nullpointerexception-指定された注釈クラスがnullの場合
次のバージョンから始めます。
1.5
GetAnnotation
<t拡張アノテーション> t getAnnotation(class <t> annotationclass)この要素の指定されたタイプのコメントがある場合、これらのコメントを返します。
パラメーター:
AnnotationClass-アノテーションタイプに対応するクラスオブジェクト
戻る:
このオブジェクトに指定されたコメントタイプの要素のタイプのコメントが存在する場合、これらのコメントは返されます。
投げる:
nullpointerexception-指定された注釈クラスがnullの場合
次のバージョンから始めます。
1.5
GetAnnotations
annotation [] getAnnotations()この要素に存在するすべてのコメントを返します。 (この要素がコメントされていない場合、長さゼロの配列が返されます。)メソッドの呼び出し元は、返された配列を自由に変更できます。これは、他の発信者によって返される配列に影響を与えません。
戻る:
この要素に存在するすべてのコメント
次のバージョンから始めます。
1.5
GetDeclaredAnnotations
annotation [] getDeclaredAnnotations()この要素に直接存在するすべてのコメントを返します。このインターフェイスの他の方法とは異なり、この方法は継承された注釈を無視します。 (この要素に直接コメントが存在しない場合、長さゼロの配列が返されます。)メソッドの発信者は、返された配列を自由に変更できます。これは、他の発信者によって返される配列に影響を与えません。
戻る:
この要素に直接存在するすべてのコメント
次のバージョンから始めます。
1.5
リフレクションを使用してランタイム保持ポリシーの注釈情報を読む例を次に示します。
カスタムアノテーション:
@retention(retentionPolicy.runtime)public @interface myannotation {string [] value1()default "abc";}カスタムアノテーションを使用してください:
public class annotationTest2 {@myannotation(value1 = {"a"、 "b"})@deprecated public void execute(){system.out.println( "method"); }}注釈で情報を読む:
public static void main(string [] args)Throws seculityexception、nosuchmethodexception、legalargumentexception、Illegalaccessexception、InvocationTargetException {annotationTest2 AnnotationTest2 = new AnnotationTest2(); // annotationTest2classのgetClassインスタンス<AnnotationTest2> c = annotationTest2.class; // getMethodInstanceメソッド方法= c.getMethod( "execute"、new class [] {}); //メソッドがmyannotationアノテーションを含むかどうかを判断します。 // method method.invoke(annotationTest2、new Object [] {})を実行します。 // myannotation string [] value1 = myannotation.value1()を取得します。 System.out.println(value1 [0]); } //メソッドアノテーション[] annotations = method.getAnnotations()ですべての注釈を取得します。 for(annotation annotation:annotations){system.out.println(annotation); }}8。限られた注釈の使用:
限られた注釈は@targetを使用します。
@documented
@retention(value = runtime)
@target(value = annotation_type)
public @Interfaceターゲットは、注釈タイプが適用されるプログラム要素のタイプを示します。ターゲットメタコメントがコメントタイプ宣言に存在しない場合、宣言されたタイプは任意のプログラム要素で使用できます。このようなメタコメントが存在する場合、コンパイラは指定された使用制限を実施します。たとえば、このメタコメントは、宣言タイプ自体、つまりメタコメントタイプであることを示しています。コメントタイプの宣言でのみ使用できます。
@target(elementType.annotation_type)public @interface metaannotationtype {...}このメタコメントは、宣言タイプが複雑な注釈型宣言のメンバータイプとしてのみ使用できることを示しています。コメントに直接使用することはできません。
@target({})public @interface membertype {...}これは、ターゲットコメントにelementType定数が複数回表示されることを示すコンパイル時間エラーです。たとえば、次のメタコメントは違法です。
@target({elementType.field、elementType.Method、elementType.field})public @interface bogus {...} public ennum elementTypeEnum <elementType>プログラム要素タイプを拡張します。この列挙タイプの定数は、Javaプログラムで宣言された要素の簡単な分類を提供します。
これらの定数は、ターゲットメタコメントタイプとともに使用され、コメントタイプを使用することが合法かを指定します。
annotation_type
コメントタイプ宣言
コンストラクタ
コンストラクターメソッドステートメント
分野
フィールド宣言(列挙定数を含む)
local_variable
ローカル変数宣言
方法
メソッドステートメント
パッケージ
パッケージステートメント
パラメーター
パラメーター宣言
タイプ
クラス、インターフェイス(コメントタイプを含む)、または列挙宣言
注釈の使用に関する制限の例:
@target(elementType.Method)public @interface myannotation {string [] value1()default "abc";}9.ヘルプドキュメントにメモを追加します。
Javadocファイルの作成中にAPIファイルに注釈情報を追加するには、java.lang.annotation.documentedを使用できます。
カスタム注釈でビルド注釈文書を宣言します。
@documentedpublic @interface myannotation {string [] value1()default "abc";}カスタムアノテーションを使用してください:
public class annotationTest2 {@myannotation(value1 = {"a"、 "b"})public void execute(){system.out.println( "method"); }}10。注釈で継承を使用します:
デフォルトでは、注釈はサブクラスに継承されません。 java.lang.annotation.inheritedアノテーション宣言をカスタム注釈を使用するときに追加できます。
@documented
@retention(value = runtime)
@target(value = annotation_type)
public @interface継承は、注釈型が自動的に継承されていることを示します。継承されたメタアノテーションがコメントタイプ宣言に存在し、ユーザーがクラス宣言にコメントタイプを照会し、クラス宣言にこのタイプのコメントがない場合、コメントタイプはクラスのスーパークラスで自動的にクエリされます。このプロセスは、このタイプのコメントが見つかるか、クラス階層の最上位レベルに達するまで繰り返されます。スーパークラスにそのタイプの注釈がない場合、クエリは現在のクラスにそのような注釈がないことを示します。
注釈タイプを使用してクラス以外のものをコメントする場合、このメタコメントタイプは無効であることに注意してください。また、このメタコメントは、スーパークラスからのコメントの継承のみを促進することに注意してください。コメントが実装されたインターフェイスには無効です。
上記の記事では、Javaのカスタムアノテーションと、ランタイム中に注釈を取得するためのリフレクションの使用について、私が共有するすべてのコンテンツについて簡単に説明しています。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。