カスタム注釈
I.はじめに
XML設定ファイルのさまざまな開発プロセスでは複雑な設定手順を引き起こし、コードのロジックは、直感的で、他のではない問題が徐々にノートを交換してきた、どこにでも今のプロジェクトで使用することのメモをカスタマイズする方法を、様々なノートをコードしていますか?
第二に、カスタム注釈必要が知っています
&カスタム注釈タイプ:同じレベルでクラスを定義し、キーワード@interface新しいアノテーションクラスの用途を定義します。
&カスタム注釈クラスの継承:カスタム注釈クラスが自動的にjava.lang.annotation.Annotationインタフェースを継承します
&カスタム注釈クラスのメンバ変数:クラスで定義されたカスタム注釈メンバ変数は、ノンパラメトリック法の形で述べました。メソッドの名前は、変数名は、メソッドの戻り値型が変数型です。(また、メンバ変数の設定パラメータとしても知られます)
*たとえば、次の文字列名(){} - >名が変数名である文字列は、変数の型です。
&型のメンバ変数:8つの基本データ型、文字列型、クラス型、列挙型、注釈タイプ、アレイの上記タイプの全て
&カスタム注釈デフォルト:あなたは初期値を作成する必要がある場合は、クラスのノートを作成します。あなたは、変数を使用して、デフォルトの初期値を作成することができ、変数名は、一般的に使用される値
*例如:ブール値()デフォルト真
コメントは、定義された設定パラメータが含まれている場合、それはデフォルト値を持っている場合を除き&、あなたは、使用中のときのパラメータ値を指定する必要があります。フォーマットは「=値」を一つのパラメータのみのメンバー、および名前の値ならば、あなたは省略することができ、「パラメータ名=パラメータ値」であります
第三に、カスタム注釈
はじめに上記の内容をより深く理解を作成するためのノート、上記のカスタム注釈を使用します。
- ノートを作成します
/**
* 使用 @interface 关键字 定义一个注解
* 自定义注解默认自动继承了java.lang.annotation.Annotation接口
*/
public @interface MyAnnotation {
}
- ノートに何の初期値パラメータ設定を作成していません
public @interface MyAnnotation {
// 定义注解成员变量,value就是变量名称,String就是变量类型。成员变量又叫参数配置
// 没有指定初始值的参数配置
String value();
}
使用は一切初期値を注釈しない、あなたはパラメータを割り当てる必要があります。
// 使用注解,给参数赋值
@MyAnnotation(value = "王刚")
public class AnnotationTest {
private static String name="张伟";
public static void main(String[] args) {
System.out.println(name);
}
}
- 作成注釈パラメータは、値を初期化されています
public @interface MyAnnotation {
/**
* 1.使用 default 关键字 初始化 参数配置 值
* 2.如果只有一个参数配置,建议参数配置名称使用value
* @return
*/
String value() default "张国强";
}
使用時の注意事項初期設定パラメータを割り当てることはできません
// 初始化参数配置,使用注解时可以不用赋值
@MyAnnotation
public class AnnotationTest {
private static String name="张伟";
public static void main(String[] args) {
System.out.println(name);
}
}
第四に、元のメモ
元のノート:Annotionの他Annotionに関係がメタ注釈メタアノテーションです
人民元は、4種類のノート文書化され、継承されて保持、ターゲットを、:
@Retention:指定注釈ライフサイクル。@Rentention RetentionPolicyは、型のメンバ変数が含まれている、@Rententionを使用しなければならない値のメンバ変数の値を指定
* RetentionPolicy.SOURCE:効果的なのは、(すなわち、ソースファイルが残る)、コンパイラは、ソースファイル内でこの戦略のコメントを破棄します。
* RetentionPolicy.CLASS:効果的な(つまりクラス予約)クラスファイルでは、Javaプログラムを実行すると、JVMはノートを保持しません。これがデフォルト値です
* RetentionPolicy.RUNTIME:効果的な実行時(つまり、予約実行時)、详细ラインは、Javaプログラムを実行する際に、JVMがコメントを保持します。プログラムが反射することによって得ることができることに留意されたいです。
@Target:コードに使用できるカスタム注釈プログラム要素を定義します。@Targetまた、メンバ変数という名前の値が含まれています。
* TYPE:アプリケーションに基づいてカスタム注釈を定義
* CONSTRUCTOR:カスタム注釈を定義するアプリケーション・ビルダー
* FIELD:カスタム属性フィールド注釈アプリケーションを定義します
* METHOD:カスタム注釈アプリケーションのメソッドを定義します
* PARAMETER:メソッドで使用されるパラメータの形式でカスタム注釈を定義します
* LOCAL_VARIABLE:ローカル変数のアプリケーションでカスタム注釈を定義します
* ANNOTATION_TYPE:アプリケーションの注釈タイプでカスタム注釈を定義します
*パッケージ:カスタムアプリケーションパッケージのアノテーションを定義します
@Documented:カスタムアプリケーションクラス上の注意事項は、Javadocドキュメントを生成しています。デフォルトでは、Javadocが注釈に含まれていない場合、注釈は設定文書化として定義する必要があります保持ランタイム値。
@継承:それは注釈が継承されています修正です。クラスはアノテーションを使用して変更@Inheritedされている場合は、それが自動的にサブクラスのコメントを持っています。
第五に、メタアノテーションの使用
- @Retention要素注釈:注釈が記述メタデータアノテーションの値の上記範囲内で、ライフサイクルのライフサイクルを指定しました。
//定义自定义注解的生命周期
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
/**
* 1.使用 default 关键字 初始化 参数配置 值
* 2.如果只有一个参数配置,建议参数配置名称使用value
* @return
*/
String value() default "张国强";
}
- @Target:コードに使用できるカスタム注釈プログラム要素を定義します。@Targetまた、メンバ変数という名前の値が含まれています。
/**
* 用于指定被修饰的 Annotation 能用于修饰哪些程序元素
*/
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
/**
* 1.使用 default 关键字 初始化 参数配置 值
* 2.如果只有一个参数配置,建议参数配置名称使用value
* @return
*/
String value() default "张国强";
}
ターゲットのみ定義方法は、これが唯一使用される方法にコメントすることができます。
//定义注解只能用在方法上
@Target({METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
/**
* 1.使用 default 关键字 初始化 参数配置 值
* 2.如果只有一个参数配置,建议参数配置名称使用value
* @return
*/
String value() default "张国强";
}
テスト対象範囲
- @Documented:カスタムアプリケーションクラス上の注意事項は、Javadocドキュメントを生成しています。デフォルトでは、Javadocが注釈に含まれていない場合、注釈は設定文書化として定義する必要があります保持ランタイム値。
@Documented
public @interface MyAnnotation {
/**
* 1.使用 default 关键字 初始化 参数配置 值
* 2.如果只有一个参数配置,建议参数配置名称使用value
* @return
*/
String value() default "张国强";
}
でTestAppクラスはJavadocドキュメントを生成した後@Documentedノート、注釈の名前を使用され、クラスは、文書で使用されます。
class TestApp{
/**
* 该方法为测试方法
*/
@MyAnnotation
public static void test() {
System.out.println("测试方法");
}
}
- @Inherited:それは注釈が継承されています修正です。クラスはアノテーションを使用して変更@Inheritedされている場合は、それが自動的にサブクラスのコメントを持っています。
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {
/**
* 1.使用 default 关键字 初始化 参数配置 值
* 2.如果只有一个参数配置,建议参数配置名称使用value
* @return
*/
String value() default "张国强";
}
ただ、サブクラスは、注釈を追加しません、親クラスに変更@Inheritedするコメントを追加するには、サブクラスは親クラスを継承定義します。
/**
* 定义Tests为父类,TestApp继承父类。在父类上添加一个被 @Inherited 修饰的注解 @MyAnnotation
*/
@MyAnnotation
class Tests{
public static void test() {
System.out.println("父类");
}
}
class TestApp extends Tests{
/**
* 该方法为测试方法
*/
public static void test() {
System.out.println("子类");
}
}
テストカテゴリ:注釈情報が反射によりサブクラスを取得するために、説明のサブクラスは、親クラスのノートを継承します。
public class AnnotationTest {
public static void main(String[] args) {
//反射获取子类的字节码文件。
Class clazz = TestApp.class;
//获取子类的注解信息
Annotation[] annotations = clazz.getAnnotations();
for (int i = 0; i < annotations.length; i++) {
System.out.println(annotations[i]);
}
}
}
テスト結果
@day.annotation.MyAnnotation(value=张国强)
六、Java8は、新機能ノート
- @Repeatable:注釈は、クラスの同じ注釈再利用し、繰り返してもよいです。
繰り返し使用上の注意:
2つのアノテーションを定義する必要があり、アノテーション名がAとBとします
①、声明@Repeatable、B Notesネームの価値のメンバーのコメント:B.class
②、B型注釈パラメータは、タイプAの配列でなければならない:A []の値();
②、注釈メタデータアノテーション情報の注釈メタデータアノテーションAとBは同じでなければなりません。
- 繰り返しのノートの例
コメント
//重复注解
@Repeatable(B.class)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface A {
String value() default "Hello My is A";
}
Bご注意
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface B {
A[] value();
}
テストカテゴリ
public class App {
//重复使用注解
@A("My is name A")
@A("My is name B")
public void test() {
System.out.println("测试类");
}
}
- @Targetノートには、パラメータを拡張しました
その注釈はどこでも使用できるようにjava8パラメータに@Targetに2種類のパラメータを追加しました。
TYPE_PARAMETER:ノート(:ジェネリック宣言など)宣言型の変数に書き込むことができることを示しています
TYPE_USE:ノートは使用文のいずれかのタイプに書き込むことができることを示しています
ノート@Targetアノテーションインスタンス
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface A {
String value() default "Hello My is A";
}
テストカテゴリ
// TYPE_PARAMETER类型将注解使用在泛型上
public class App<@A T> {
/**
* TYPE_USE 将注解使用在 异常、集合、类型转换
*/
public void test(T t) throws @A RuntimeException{
List<@A String> list = new ArrayList<>();
int num = (@A int) 10L;
System.out.println("测试类");
}
}