アノテーションの使用アノテーションJavaでのアノテーションの詳細な理解カスタムアノテーションメタアノテーション

注釈

1.コンセプト

(1)注釈:プログラムを説明するために使用され、コンピューターがJDK1.5以降の新機能を確認できるようにします
@注解名称

(2)注釈:コーダー向けにプログラムをテキストで説明する

2.機能

(1)ドキュメント
作成するコードで識別された注釈からドキュメントドキュメントを生成します。

①クラスを作成する

/**
 * 注解javadoc演示
 * @author 周杰伦  表示此类(文档)作者
 * @version 1.0  表示此类(文档)的版本
 * @since 1.8  表示从JDK1.8之后可以使用此类
 */
public class AnnoDemo1 {
    
    
    /**
     * 计算两数的和
     * @param a 整数
     * @param b 整数
     * @return 两数的和
     */
    public int add(int a, int b ){
    
    
        return a + b;
    }
}

②このJavaファイルにはjavadoc命令を使用してください

ここに画像の説明を挿入
③ドキュメントファイルを開く

ここに画像の説明を挿入

(2)コード分析:リフレクションを使用して、コード内の注釈を介してコードを分析します

(3)コンパイルチェック:アノテーションなどでコンパイルチェックを実現@Override

3.カスタム注釈

(1)フォーマット

public @interface 注解名称 {
    
    
// 属性列表;
}

(2)エッセンス

アノテーションは基本的に、次のように、デフォルトでアノテーションインターフェイスを継承するインターフェイスです。

public interface 自定义注解 extends java.lang.annotation.Annotation {
    
    }

(3)注釈の属性

注釈付き属性は、インターフェースの抽象メソッドです

請求:

①プロパティの戻り値の型:
i。基本データ型
ii。文字列型文字列
iii。列挙型
iiii。注
iiiii。上記の型の配列
注:クラス型やvoidなどの他の型は使用できません。

②属性を定義した後、属性を使用する場合は属性に値を割り当てる必要があります

// 自定义注解
public @interface MyAnno {
    
    
    //以下均为省略了abstract关键字的抽象方法

    Person per(); //枚举类型,其中有P1,P2

    MyAnno2 anno2(); // 注解类型,定义另一个注解MyAnno2

    String[] strs(); // 数组类型

    //使用default关键字给属性赋值,表示默认初始值,
    //则使用注解时,可以不给此属性赋值,而使用默认值
    int value() default 15; //基本数据类型
}
// 使用注解
// 数组赋值时,值使用{}包裹,如果数组中只有一个值,可以省略{}
@MyAnno(per = Person.P1, anno2 = @MyAnno2, strs={
    
    "bbb", "ccc"})
public class Worker {
    
     // 自定义类
    //成员变量、属性
}

注意:

  1. アノテーションに属性が1つしかなく、名前がvalueの場合、値のタイプに関係なく、値を割り当てるときに値を省略でき、値は次のように直接定義できます。@SuppressWarnings(“all”)

  2. 同じクラスまたはメソッドに対して、複数の異なるアノテーションを同時に使用できます

4.メタアノテーション

注釈を説明するために使用される注釈。カスタム注釈の上の行にメタ注釈を記述します。4つのタイプがあります。

(1)@Target:アノテーションが機能できる位置を記述します。
属性:ElementType [] value();その中で、ElementTypeは列挙型であり、一般的に使用される値です。

  • TYPEは、クラスに作用できることを意味します
  • METHODは、メソッドに作用できることを意味します
  • FIELDは、変数に作用できることを意味します

(2)@Retention:注釈が保持される段階を記述します。
属性:RetentionPolicy value();ここで、RetentionPolicyは列挙型であり、その値は次のとおりです。

  • RUNTIMEは、現在のアノテーションがクラスファイルに保持され、JVMによって読み取られることを意味します。この値は最も一般的に使用され、値SOURCE、CLASSを取ることもできます。

(3)@Documented:説明的なコメントをAPIドキュメントに抽出できます

(4)@Inherited:記述アノテーションを継承可能:親クラスがこのメタアノテーションで記述されたアノテーションを使用する場合、このクラスを継承するサブクラスは、アノテーションを書き込まなくても自動的にこのアノテーションで記述されます。

@Target({
    
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//自定义注解Pro
public @interface Pro {
    
    
    String className();
    String methodName();
}

5.注釈の属性値を取得します

// 使用上述自定义注解Pro
@Pro(className = "cn.itcast.annotation.Demo1", methodName = "show")
public class ReflectTest {
    
    
    public static void main(String[] args) throws Exception {
    
    
        // 1. 使用该类的字节码文件对象解析注解
        Class<ReflectTest> reflectTestClass = ReflectTest.class;
        // 2. 获取指定的注解对象
        Pro an = reflectTestClass.getAnnotation(Pro.class);
        // 第二步其实就是在内存中生成了一个该注解接口的子类实现对象
        
        /*
            public class ProImpl implements Pro{
                public String className(){
                    return "cn.itcast.annotation.Demo1";
                }
                public String methodName(){
                    return "show";
                }
            }
        */
        
        // 3. 调用注解对象中定义的抽象方法,获取返回值
        String className = an.className();
        String methodName = an.methodName();
        System.out.println(className); //cn.itcast.annotation.Demo1
        System.out.println(methodName); //show
    }
}

注:複数のアノテーションを使用する場合は、ClassオブジェクトのnullパラメーターgetAnnotation()メソッドを呼び出して、すべてのアノテーションオブジェクトを取得し、Annoation []を返します。

おすすめ

転載: blog.csdn.net/weixin_49343190/article/details/109168408