Javaのカスタムアノテーション-アノテーションの使用

アノテーション-カスタムアノテーション

アノテーション関数は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());// 获取属性是否启用
			}
		}
	}
}

スクリーンショットを実行:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/javanofa/article/details/104900822