Java: アノテーション

注釈とは何ですか

アノテーションは新しいデータ型で、インターフェイスに非常に似ており、クラス、インターフェイス、列挙と同じレベルにあります。

@ で始まるマークに相当し、クラス、プロパティ、メソッド、パラメータなどの先頭を宣言できます。要素の特定の機能を記述、ラベル付け、実装するために使用されます。

機能:
1. ドキュメントの作成: アノテーションに従ってドキュメントを生成します
。 2. コード分析: アノテーションによるリフレクションを使用してコードを分析します。
3. コンパイル検査: コンパイラーがオーバーライドなどのアノテーションを通じて基本的な型チェックを実装できるようにします。

JDK の事前定義されたアノテーション

java.lang パッケージ内

注釈 効果
@オーバーライド メソッドの前で、親クラスのメソッドをオーバーライドします。
@非推奨 クラス、属性、メソッドの前にある場合は、時代遅れで推奨されないことを意味します
@SuppressWarning クラス、属性、メソッドの前では、警告メッセージを閉じることを意味します。
package cn.xxx.annotation;

import java.util.Date;

@SuppressWarnings("all")
public class AnnoDemo2 {
    
    

    @Override
    public String toString() {
    
    
        return super.toString();
    }

    @Deprecated//过期注解
    public void show1(){
    
    
        //有缺陷
    }

    public void show2(){
    
    
        //替代show1方法
    }

    public void demo(){
    
    
        show1();
        Date date = new Date();
    }
}

カスタム注釈

@interface+ メタアノテーションの使用

// 元注解
public @interface 注解名 {
    
    
	// 抽象方法或者叫属性列表
}

メタアノテーション: アノテーションにタグ付けされたアノテーション

メタアノテーション 効果
@目標 アノテーションの範囲、つまりクラスやメソッドなど、どの要素にマークを付けることができるかを定義します。省略した場合は、任意の要素の前に置くことができます
@保持 アノテーションのライフサイクルを定義します。SOURCE、CLASS、RUNTIME、コンパイル時に保持、クラスに保持、通常は RUNTIME を使用します。
@文書化されました javadocを使用してドキュメントを生成するときにアノテーションを含めるかどうか
@継承 サブクラスが親クラスのアノテーションを継承できるようにする

アノテーションは最終的に次のようにコンパイルされます。

public interface MyAnno extends java.lang.annotation.Annotation {
    
    }

したがって、アノテーションの本質はインターフェースであり、デフォルトでアノテーションインターフェースを継承します。

package cn.xxx.annotation;

import java.lang.annotation.*;

@Target({
    
    ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnno3 {
    
    
}

注釈を使用する

文法:

@注解名(属性名=属性值,属性名=属性值)
  • アノテーションを使用する場合、アノテーションで抽象メソッドの戻り値を指定する必要があります。これは、アノテーションのプロパティ値の指定とも呼ばれます。
  • 属性名は、アノテーション内の抽象メソッドの名前です。
package cn.xxx.annotation;

public @interface MyAnno {
    
    

     int value();
     Person per();
     MyAnno2 anno2();
     String[] strs();
     /*String name() default "张三";*/
     /*String show2();

     Person per();
     MyAnno2 anno2();

     String[] strs();*/
}
package cn.xxx.annotation;

@MyAnno(value=12,per = Person.P3,anno2 = @MyAnno2,strs={
    
    "bbb","aaa"})
@MyAnno3
public class Worker {
    
    
    @MyAnno3
    public String name = "aaa";
    @MyAnno3
    public void show () {
    
    
    }
}

注釈の解析

ライフサイクルが RUNTIME であるアノテーションの場合。アノテーションの解析とは、アノテーションに定義されている属性値を取得することです。次の 3 つのステップがあります。

  1. アノテーションで定義された場所(クラス、メソッド、フィールド)のオブジェクトを取得します
  2. 指定されたアノテーションを取得する
    • getAnnotation(クラス)
    //其实就是在内存中生成了一个该注解接口的子类实现对象
    public class ProImpl implements Pro{
          
          
        public String className(){
          
          
            return "cn.itcast.annotation.Demo1";
        }
        public String methodName(){
          
          
            return "show";
        }
    }
    
  3. アノテーション内の抽象メソッドを呼び出して、構成された属性値を取得します。

例:

// 1、获取类上的注解
Class cls = Student.class;
// 2、获取该类Student上的所有注解,不一定获取类上的注解,也可以获取方法上的注解,这时候就是 `method.getAnnotation()`
Annotation[] annotation = cls.getAnnotations();
// 仅获取该类上的Pro注解
Pro annotation = cls.getAnnotation(Pro.class);
// 3、获取注解上的属性方法
String className = annotation.className() // cn.xxx.annotation.Demo1
String className = annotation.methodName() // show
...

要約する

アノテーションとはラベルのようなもので、例えば関数にCheckアノテーションを付けるとその関数がチェック可能であることを意味し、対応するチェックプログラムはCheckアノテーションを認識して対応するプログラムを実行することができます。チェックプログラムがない場合、注釈自体は意味がありません。単なるコメントのようなものです。

1. ほとんどの場合、カスタム アノテーションではなく、アノテーションのみが使用されます
1. コンパイラー 2. プログラムの解析
3. アノテーションはプログラムの一部ではなく、ラベルのようなもの

おすすめ

転載: blog.csdn.net/weixin_43972437/article/details/132237180