記事ディレクトリ
注釈
アノテーションの基本的な概要
注釈の概要:
Java アノテーション (Annotation) は、Java アノテーションとも呼ばれ、JDK5.0 によって導入されたアノテーション メカニズムです。
Java言語のクラス、コンストラクタ、メソッド、メンバ変数、パラメータなどにはアノテーションを付けることができます。
アノテーションの役割:
Javaのクラス、メソッド、メンバ変数にマークを付けて、業務要件に応じた特殊な処理を行います。
例: JUnit フレームワークでは、@Test でマークされたメソッドはテスト メソッドとして実行できますが、マークのないメソッドはテスト メソッドとして実行できません。
カスタム注釈
カスタム注釈:
カスタムアノテーションとは、自分でアノテーションを作成して利用することです。
カスタム注釈の形式は次のとおりです。
public @interface 注解名称 {
public 属性类型 属性名() default 默认值 ;
}
注:
カスタム アノテーションのデフォルト値は省略できます。
カスタマイズはデフォルトで public であり、public 修飾子は省略できます。
デモコード:
カスタム注釈 MyBook
public @interface MyBook {
String name();
String[] authors();
// 给默认值
double price() default 88.8;
}
カスタム アノテーションを使用して、クラス、変数、メソッドなどにアノテーションを付けます。
@MyBook(name = "Java数据结构", authors = {
"作者1", "作者2"})
public class AnnotationDemo {
@MyBook(name = "Java数据结构1", authors = {
"作者1", "作者2"})
public static void main(String[] args) {
@MyBook(name = "Java数据结构2", authors = {
"作者1", "作者2"})
int num = 0;
}
}
特殊なタイプ:
value 属性は、value 属性が 1 つしかない場合、value 属性を使用するときに値の名前を省略できます。
public @interface Book {
// 只有一个value属性
String value(); // 特殊属性
}
//@Book(value = "/delete")
@Book("cba") // 可以省略不写
public class AnnotationDemo {
}
ただし、複数の属性があり、複数の属性にデフォルト値がない場合は、値の名前を省略できません。
複数の属性にデフォルト値がある場合、値の名前は省略できます。
// 多个值, 且其他值都有默认值
public @interface Book {
String value(); // 特殊属性
String name() default "一本书";
double price() default 99.9;
}
//@Book(value = "/delete")
@Book("cba") // 可以省略不写
public class AnnotationDemo {
}
メタアノテーション
メタ アノテーションの定義:
メタ アノテーションはアノテーションのアノテーションです
メタアノテーションは 2 つあります。
@Target: カスタム アノテーションのみを使用できる場所を制約します。
@Retention: アノテーションのライフサイクルを宣言します。
Targetで使用できる値はElementType列挙クラスで定義されており、共通の値は以下のとおりです。
TYPE、アノテーションがクラスとインターフェースのみにアノテーションを付けることができることを示します
FIELD、注釈がメンバー変数にのみ注釈を付けることができることを示します
METHOD、アノテーションがメンバー メソッドのみにアノテーションを付けることができることを示します
PARAMETER、アノテーションがメソッドパラメータのみにアノテーションを付けることができることを示します
CONSTRUCTOR、アノテーションがコンストラクターにのみアノテーションを付けることができることを示します
LOCAL_VARIABLE、注釈がローカル変数にのみ注釈を付けることができることを示します
@Target({
ElementType.FIELD, ElementType.METHOD}) // 表示自定义注解只能对成员变量和方法进行注解
public @interface MyTest {
}
Retention で使用できる値は RetentionPolicy 列挙クラスで定義されており、一般的な値は次のとおりです (通常は使用されません。アノテーションが常に存在することを願っています)。
SOURCE: 注釈はソース コード段階にのみ適用され、生成されたバイトコード ファイルには存在しません。
CLASS: アノテーションはソースコード段階、バイトコードファイル段階で機能しますが、ランタイム段階では存在せず、デフォルト値です。
RUNTIME: アノテーションはソースコードフェーズ、バイトコードファイルフェーズ、およびランタイムフェーズで使用されます (開発で一般的に使用されます)
@Retention(RetentionPolicy.RUNTIME) // 表示注解一直存在
public @interface MyTest {
}
アノテーション分析
注釈分析:
アノテーションの操作には解析が必要となることが多く、アノテーションの解析とは、アノテーションの有無を判断し、アノテーションがあればその内容を解析することである。
注釈の解析に関連するインターフェイス:
注釈: 注釈の最上位インターフェイス。すべての注釈は Annotation タイプのオブジェクトです。
AnnotatedElement: 注釈の解析に関連する解析メソッドを定義する、注釈付き要素インターフェイス
アノテーションの方法は次のとおりです。
すべての反映されたクラス コンポーネントであるクラス、メソッド、フィールド、およびコンストラクターは AnnotatedElement インターフェイスを実装しており、それらはすべて注釈を解析する機能を備えています。
方法 | 説明する |
---|---|
注釈[] getDeclaredAnnotations() | 現在のオブジェクトで使用されているすべての注釈を取得し、注釈の配列を返します。 |
getDeclaredAnnotation(Class<T> annotationClass) | 注釈の種類に応じて、対応する注釈オブジェクトを取得します |
isAnnotationPresent(Class<Annotation> annotationClass) | 現在のオブジェクトが指定されたアノテーションを使用しているかどうかを判断します。使用されている場合は true を返し、それ以外の場合は false を返します。 |
注釈を解析するためのヒント:
どのコンポーネントに注釈が付けられているかについて、どのコンポーネント オブジェクトを最初に取得します。
たとえば、アノテーションがメンバー メソッドに作用する場合、メンバー メソッドに対応する Method オブジェクトを取得してから、上記のアノテーションを取得する必要があります。
たとえば、アノテーションがクラスに作用する場合、クラスの Class オブジェクトが必要であり、その後、上記のアノテーションが必要になります。
たとえば、アノテーションがメンバー変数に作用する場合、そのメンバー変数に対応する Field オブジェクトを取得してから、上記のアノテーションを取得する必要があります。
アノテーション分析の実践事例:
手順は次のとおりです。
アノテーション Book を定義するには、次の要件があります。
- 属性が含まれます: String value() 本のタイトル
- インクルード属性: doubleprice() 価格、デフォルト値は 100
- 属性が含まれます: String[] authors() 複数の著者
- アノテーションを使用できる場所を制限する: クラスとメンバー メソッド
- アノテーションの有効範囲を指定: RUNTIME
BookStore クラスを定義し、クラスとメンバー メソッドで Book アノテーションを使用します。
Book アノテーションのデータを取得する AnnotationDemo テスト クラスを定義します。
デモコード:
カスタムアノテーションの実装
@Target({
ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {
String value();
double price() default 100;
String[] authors();
}
BookStore クラスを定義し、クラスおよびメンバー メソッドで Book アノテーションを使用します。
@Book(value = "大话西游", authors = {
"作者a", "作者b"})
public class BookStore {
@Book(value = "盗梦空间", price = 10.99,authors = {
"作者1", "作者2"})
public void bubBook() {
System.out.println("买书成功");
}
}
Book アノテーションのデータを取得する AnnotationDemo テスト クラスを定義します。
public class AnnotationDemo {
public static void main(String[] args) {
// 获取Class类对象
Class c = BookStore.class;
// 判断该类上是否存在Book.class这个注解对象
if (c.isAnnotationPresent(Book.class)) {
// 存在获取BookStore类的Book.class这个注解对象
Book book = (Book) c.getAnnotation(Book.class);
// 查看注解内容
System.out.println(book.value()); // 大话西游
System.out.println(book.price()); // 100.0
System.out.println(Arrays.toString(book.authors())); // [作者a, 作者b]
}
}
}