つまりJavaアノテーション:
Javaアノテーションは、定義、注釈によって、時間の後の期間であることに非常に有用であるかもしれないいくつかの情報を格納する、注釈を追加するためのものです。
Javaアノテーションは、Javaと呼ばれるラベル我々は(すなわち、特定の情報を添付)標準的な方法、クラス、パラメータ、パッケージ、ドメインや変数に追加できるように、Javaはメカニズムを提供します。一定期間後、反射による使用のためにマークされた抽出情報。
サンプル(自分のノートの実現):
輸入java.lang.annotation.ElementType; 輸入java.lang.annotation.Retention。 輸入java.lang.annotation.RetentionPolicy; 輸入java.lang.annotation.Target; @Target(値 = {ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) パブリック @ インタフェースMyAnnotaion { String値(); }
輸入java.lang.annotation.ElementType; 輸入java.lang.annotation.Retention。 輸入java.lang.annotation.RetentionPolicy; 輸入java.lang.annotation.Target; @Target(値 = {ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) パブリック @ インタフェースMyFieldAnnotaion { String値(); 文字列型(); 文字列の長さ(); }
インポートしたjava.io.Serializable; @MyAnnotaion(「学生」) のパブリック クラスの学生の実装Serializableを{ プライベート 静的 最終 長い serialVersionUIDの= 1L ; @MyFieldAnnotaion(値 = "1"、タイプ= "INT"、長さ= "10" ) 文字列ID。 @MyFieldAnnotaion(値 = "蕾蕾"、タイプ= "文字列"、長さ= "200" ) 文字列名。 パブリック文字列のgetId(){ 戻りID。 ID; } パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } @Override パブリック文字列のtoString(){ 戻り "生徒{" + "ID = '" + ID + '\'' + "NAME = '" +名+ '\'' + '}' 。 } }
インポートorg.apache.poi.ss.formula.functions.T; インポート; java.lang.annotation.Annotation インポートをjava.lang.reflect.Fieldとして; / ** *注釈を反映させた * / パブリック クラスAnnotaionDemo { パブリック 静的 ボイドメイン(文字列[]引数)をスロー例外{ クラス <T> = clazz(クラス<T>)にClass.forName( "demo.knowledgepoints.annotation.Studentを" ); //は、コメントがあるか否かを判断する 場合(clazz.isAnnotationPresent(MyAnnotaion 。クラス)){ するSystem.out.println( "コメントが存在する:MyAnnotaionを" ); } // 注釈のリストを取得 = annotaionsの] [注釈)clazz.getAnnotations(; 用(INT I = 0; I <annotaions.length; I ++ ){ するSystem.out.println( "コメント:" + annotaions [I]); } // 取得注釈と MyAnnotaion myAnnotaion = clazz.getAnnotation(。MyAnnotaion クラス); System.out.printlnは( "注釈がある:" + myAnnotaion.value()); // 取得した注釈とメソッド フィールドフィールド= clazz .getDeclaredField( "上記ID" ); // メソッドが存在するか否かにコメント field.isAnnotationPresent(MyFieldAnnotaion クラスは、)。 // メソッド注釈付きリスト field.getAnnotations(); //は、メソッドの内容にコメント取得 MyFieldAnnotaion myFieldAnnotaion = field.getAnnotation(MyFieldAnnotaion。クラス); System.out.printlnは( "値:" + myFieldAnnotaion.value()+「;タイプ: "myFieldAnnotaion.type +()+";長さ:「+ myFieldAnnotaion.lengths()); } }
結果:
この場合によると:
1.注意事項実装はキーワードが必要です。@interface。
我々はまた、リテンション@、ターゲット@アノテーションを使用ノート2.。これらは、メタアノテーションと呼ばれています
中原アノテーションは4以下のとおりです。@Retention @Target @Document @Inherited。
@Retention:注釈予約位置
@Retention(RetentionPolicy.SOURCE)//注釈は、唯一のソースコードに存在するクラスのバイトコードファイルに含まれていません
、@Retention(RetentionPolicy.CLASS)//デフォルトの保持ポリシーは、注釈は、クラスのバイトコードファイル内に存在しますが、実行時には使用できません。
@Retention(RetentionPolicy.RUNTIME)//注釈がクラスのバイトコードファイル内に存在し、実行時に反射することによって得ることができます
@Target:ターゲット注釈の役割
@Target(ElementType.TYPE)//インターフェース、クラス、列挙
@Target(ElementType.FIELD)//フィールド、列挙定数
@Target(ElementType.METHOD)//方法
@Target(ElementType.PARAMETER)//メソッドのパラメータ
@Target(ElementType.CONSTRUCTOR)//コンストラクタ
@Target(ElementType.LOCAL_VARIABLE)//ローカル変数
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE)///包
@Document:注釈がjavadocの中に含まれることを示します
@Inherited:説明サブクラスは、親クラスのノートを継承することができます
書き込むことができる3.直接法:String値();
あなたは価値その後の使用を得ることができ、外部の注釈値が書き込まれて使用してください。
; String値()デフォルトの「花」:あなたは、デフォルト値を提供することができます
AnnotaionDemo注入エンティティクラスの値によって共通機能、アノテーションを変更する方法を実装しました:
輸入org.apache.poi.ss.formula.functions.T; インポートをjava.lang.reflect.Field; 輸入java.lang.reflect.Methodオブジェクト; / ** *通过反射获取注解 * / パブリック クラスAnnotaionDemo { 公共 静的 ボイドメイン(文字列[]引数)をスロー例外{ 学生学生 =(学生)getbean( "demo.knowledgepoints.annotation.Studentを" )。 System.out.println(学生)。 } パブリック 静的オブジェクトgetbeanは、(文字列クラス名)をスロー例外{ クラス <T> clazz =(クラス<T>)にClass.forName(classNameの) // そこに注釈が(注釈が標識として使用されている)かどうかを決定する のIF(clazz.isAnnotationPresentは(MyAnnotaion!クラス){) スロー 新しい新しい例外(「不足しているクラスのノート」MyAnnotaion」は、することはできません豆」を反映得る); } // エンティティクラスの作成 オブジェクトオブジェクト= clazz.newInstanceを() フィールドを、[]フィールド = clazz.getDeclaredFields(); のための(INT I = 0; I <fields.length; I ++ ){ // フィールド名が取得 された文字列名= フィールド[I]は.getName(); // フィルタ処理シーケンス の場合(name.equals( "serialVersionUIDの" )){ 続けます。 } // 组装SET方法 クラスタイプ= <?> clazz.getDeclaredField(名).getType(); // 首字母大写 文字列交換= name.substring(0、1 ).toUpperCase() + name.substring(1 )。 方法のsetMethod = clazz.getMethod(「セット」+ 置き換えタイプ)。 // 获取字段值 フィールドフィールド= clazz.getDeclaredField(名); MyFieldAnnotaion myFieldAnnotaion = field.getAnnotation(MyFieldAnnotaion。クラス)。 値文字列 = myFieldAnnotaion.value(); // セットメソッドが実行された IF(!=値のヌル!&& "" .equals(値)){ // ---リードデータのタイプ(タイプ決意部)を決定 IF(タイプ.isAssignableFrom(文字列。クラス)){ setMethod.invoke(オブジェクト、値); } そう IF(type.isAssignableFrom(INT。クラス) || type.isAssignableFrom(整数。クラス)){ setMethod.invoke(オブジェクト、整数。 parseInt(値)); }そう であれば(type.isAssignableFrom(ダブル。クラス) || type.isAssignableFrom(ダブル。クラス)){ setMethod.invoke(オブジェクト、Double.parseDouble(値))。 } そう であれば(type.isAssignableFrom(ブール値。クラス) || type.isAssignableFrom(ブール値。クラス)){ setMethod.invoke(オブジェクト、Boolean.parseBoolean(値))。 } } } 戻りオブジェクト。 } }
結果:
反射コメント:リフレクションを使用したケースhttps://www.cnblogs.com/jssj/p/11723910.html
要約言語:例えばように春、MyBatisのおよびAS:注釈機能は広く開発の枠組みの中で使用されます。ノートは大幅に開発作業では開発作業を軽減表示されます。