アノテーション-カスタムアノテーション
アノテーション関数はJavaで提供され、クラス、構築メソッド、メンバー変数、メソッドに使用できます。パラメータの宣言など この関数はプログラムの実行には影響しませんが、コンパイラの警告などの補助ツールに影響します。
注釈タイプを定義する
アノテーション型を定義するときは、インターフェースの定義に使用するinterfaceキーワードを使用する必要がありますが、「@」記号をインターフェースキーワードの前に追加する必要があります。つまり、アノテーション型を定義するキーワードは@interfaceです。
public @interface MyAnnotation {
}
これは注釈タイプを定義するためのものです。上記で定義された注釈型にはメンバーが含まれていません。注釈型にメンバーを追加してください。
public @interface MyAnnotation {
String name();
Class type();
}
アノテーション型のメンバーを定義するときに、メンバーのデフォルト値を設定することもできます。
public @interface MyAnnotation {
String name() default "默认值";
Class type() default void.class;
}
注釈情報にアクセスする
リフレクションアノテーションを使用してアノテーション情報にアクセスできます。アノテーションを反映するには、メタアノテーションについて理解する必要があります。メタ注釈は、他の注釈、つまり注釈に注釈を付けることです。4つのメタ注釈があり、2つはよく使用される@Targetと@Retentionです。
@目標
Annotationを定義するとき、@ Targetを使用して、Annotationを適用できるプログラム要素のタイプを設定できます。@ Targetが設定されている場合、すべてのプログラム要素に適用できることを意味します。ElementType列挙型クラスの列挙型定数は、@ Targetを設定するために使用されます。
列挙型クラスElementTypeの列挙型定数
列挙型定数 | 説明 |
---|---|
ANNOTATION_TYPE | 注釈型を表します |
タイプ | クラス、インターフェース、列挙、および注釈型で使用される表現 |
コンストラクタ | メソッドの構築に使用されることを示します |
フィールド | メンバー変数と列挙型変数に使用されるを表します |
方法 | 方法に使用される手段 |
パラメータ | パラメータに使用されることを示します |
LOCAL_VARIABLE | ローカル変数を表します |
パッケージ | パッケージの手段 |
@保持
アノテーションタイプの@Retentionを設定することで、アノテーションの有効範囲を設定できます。列挙クラスRetentionPolicyの列挙定数は、@ Retentionを設定するために使用されます。@ Retentionが設定されていない場合、Annotationの有効な範囲は、列挙定数CLASSで表される範囲です。
列挙型クラスRetentionPolicyの列挙型定数
列挙型定数 | 説明 |
---|---|
ソース | アノテーションをクラスファイルにコンパイルしないことを意味します。有効範囲は最小です |
クラス | Annotationがクラスファイルにコンパイルされているが、実行時にAnnotationがJVMにロードされていないことを示します。 |
ランタイム | 実行時にアノテーションがJVMにロードされ、有効範囲が最大であることを示します |
以前に反映された3つのクラス、コンストラクター(構築メソッドクラス)、フィールド(メンバー属性クラス)、およびメソッド(メンバーメソッドクラス)はすべて、反映および注釈を付けることができるメソッドを提供します。
注釈を反映するには、前提条件があります。@ RetentionをRUNTIMEに設定する必要があります。
インスタンス
最初にDomeクラスを作成し、それにいくつかのプロパティを追加します。
public class Dome {
public String name;// 名称
public double price;// 价格
public String produced;// 厂商
}
次に、注釈タイプを定義し、これらの属性に注釈を追加します。
public @interface MyAnnotation {
String remkras() default "";//备注
boolean enable() default true;//属性是否启用,默认true
}
次にDomeクラスに戻り、プロパティに注釈を追加します。属性生成された製造元を、有効になっていない古いアノテーションに設定します。
public class Dome {
@MyAnnotation(remkras = "名称")
public String name;// 名称
@MyAnnotation(remkras = "价格")
public double price;// 价格
@Deprecated
@MyAnnotation(remkras = "厂商", enable = false)//不启用
public String produced;// 厂商
}
では、これらの注釈を振り返って、新しいクラスStudy2を作成しましょう
public class Study2 {
public static void main(String[] args) {
Class c = Dome.class;//创建class对象
Field fl[] = c.getDeclaredFields();//获取所有属性
for(Field f:fl) {
if(f.isAnnotationPresent(MyAnnotation.class)) {
//判断注解是否被MyAnnotation注解过
System.out.println(f.getName()+"被注解过");
}
}
}
}
注:
@Retentionおよび@Target設定をMyAnnotationに追加する必要があります。追加しないと機能しません。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
完全なコード
MyAnnotation:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String remkras() default "";//备注
boolean enable() default true;//属性是否启用,默认true
}
ドーム:
public class Dome {
@MyAnnotation(remkras = "名称")
public String name;// 名称
@MyAnnotation(remkras = "价格")
public double price;// 价格
@Deprecated
@MyAnnotation(remkras = "厂商", enable = false)//不启用
public String produced;// 厂商
}
Study2:
import java.lang.reflect.Field;
public class Study2 {
public static void main(String[] args) {
Class c = Dome.class;// 创建class对象
Field fl[] = c.getDeclaredFields();// 获取所有属性
for (Field f : fl) {
if (f.isAnnotationPresent(MyAnnotation.class)) {
// 判断注解是否被MyAnnotation注解过
System.out.println(f.getName() + "被注解过");
MyAnnotation m = f.getAnnotation(MyAnnotation.class);// 创建MyAnnotation对象,获取注解
System.out.print(f.getName() + "属性的注解内容:");
System.out.print("备注=" + m.remkras() + " , ");// 获取备注内容
System.out.println("属性是否启用=" + m.enable());// 获取属性是否启用
}
}
}
}
スクリーンショットを実行: