Java アノテーションの導入と使用の詳細

注釈

アノテーションの基本的な概要

注釈の概要:

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]
        }
    }
}

おすすめ

転載: blog.csdn.net/m0_71485750/article/details/127748829