天天看點

自定義java注解java注解

java注解

  • java注解
    • java内置注解
    • 自定義注解
      • 元注解
      • 注解支援的屬性
原文章位址

java注解

概念:注解用于給java代碼添加中繼資料,在編譯或者運作時解析處理這些中繼資料。注解可用于包,類,字段,方法,參數等。可以将了解為給這些包或類等等添加一個标簽。在使用架構的時候會發現各種架構都實作了自己的注解。實際上就是在類掃描的時候特殊處理這些含有注解的類或方法或字段而已。

java内置注解

  1. @Override:表示目前的方法定義将覆寫父類中的方法
  2. @Deprecated:表示代碼被棄用,如果使用了被@Deprecated注解的代碼則編譯器将發出警告
  3. @SuppressWarnings:表示關閉編譯器警告資訊

自定義注解

注解也屬于一種類型,就像class,interface一樣,可以自定義,格式如下

[@Target]
[@Retention]
[@Documented]
[@Inherited]
public @interface [名稱] {
    // 元素
}
           

使用注解有幾個條件:注解聲明、使用注解的元素、操作注解使其起作用(注解處理器)。

建立一個Bean的注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Bean {
    String value();
    //也可以設定預設值
    //String value() default "entity";
}
           

測試注解

@Bean("abc")
public class AnnotationDemo {

    public static void main(String[] args) {

        AnnotationDemo a=new AnnotationDemo();
        Class cls=AnnotationDemo.class;
        //使用反射擷取注解
        Bean annotation=(Bean) cls.getAnnotation(Bean.class);
        System.out.println(annotation.value());
    }
}
           

輸出

abc
           

元注解

元注解就是注解其他注解的注解

在java中有4個元注解

注解 作用 取值
@Target 設定注解可以應用的位置,比如在類上,還是方法上 下文中
@Retention 設定注解的生存時間 下文中
@Document 說明注解是否能被文檔化
@Inhrited 說明注解能否被繼承
  • @Target取值
    • ElementType.CONSTRUCTOR 可以給構造方法進行注解
    • ElementType.FIELD 可以給屬性進行注解
    • ElementType.LOCAL_VARIABLE 可以給局部變量進行注解
    • ElementType.METHOD 可以給方法進行注解
    • ElementType.PACKAGE 可以給一個包進行注解
    • ElementType.PARAMETER 可以給一個方法内的參數進行注解
    • ElementType.ANNOTATION_TYPE 可以給一個注解進行注解
    • ElementType.TYPE 可以給一個類型進行注解,比如類、接口、枚舉
  • Retention:取值
    • RetentionPolicy.SOURCE階段(java源檔案階段)
    • RetentionPolicy.CLASS階段(class檔案階段)
    • RetentionPolicy.RUNTIME階段(記憶體中的位元組碼運作時階段)
    • 預設是在RetentionPolicy.CLASS階段

此時可以明白上述Bean注解應用于類,周期是運作時期

注解支援的屬性

  1. 所有基本資料類型(int,float,boolean,byte,double,char,long,short)
  2. String類型
  3. Class類型
  4. enum類型
  5. Annotation類型
  6. 以上所有類型的數組

代碼示例:

//如果沒有@Retention(RetentionPolicy.RUNTIME),在反射時拿不到相應的值,會抛空指針異常,因為預設注解生存時間是class檔案
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Bean2 {

    String a();
    int b();
    boolean c();
    long[] d();

}
           

測試

@Bean2(a="aaaa",b=99,c=false,d={1,3,5,7,9})
public class AnnotationDemo2 {

    public static void main(String[] args) {
        Class cls=AnnotationDemo2.class;
        Bean2 bean2=(Bean2) cls.getAnnotation(Bean2.class);
        System.out.println(bean2.a());
        System.out.println(bean2.b());
        System.out.println(bean2.c());
        System.out.println(Arrays.toString(bean2.d()));
    }
}
           

控制台列印

aaaa
99
false
[1, 3, 5, 7, 9]