1. 程式人生 > 其它 >Java SE:註解和反射

Java SE:註解和反射

Annotation-註解

概述

Annotation 是 JDK 5.0 引入的技術。

  1. 作用

    • 對程式做出解釋(該作用類似 註釋-comment);
    • 可以被程式讀取(如 編譯器)。
  2. 格式:@註解名 (引數)

    // 例項
    @Override
    @SuppressWarnings(value = "unchecked")
    
  3. 使用範圍

    • 在package、class、method、field等的上方使用;
    • 可以通過反射機制來訪問。

內建註解

  1. @Override:重寫超類方法;
  2. @Deprecated:方法不建議使用;
  3. @SuppressWarnings:抑制編譯時的警告資訊。

元註解

元註解 (meta-annotation) 負責註解其它的註解

Java 定義了 4 個元註解:

  1. @Documented:生成 JavaDoc 文件
  2. @Retention:保留級別(在哪裡有效)
    • SOURCE:原始碼
    • CLASS:類
    • RUNTIME:執行時
  3. @Target:使用範圍(在哪裡使用)
    • TYPE
    • FILED
    • METHOD
    • PARAMETER
    • CONSTRUCTOR
    • LOCAL_VARIABLE
    • ANNOTATION_TYPE
    • PACKAGE
    • 1.8 引入
      • TYPE_PARAMETER
      • TYPE_USE
  4. @Inherited:子類可以繼承父類中的該註解

自定義註解

使用 @interface 自定義註解,自動實現介面java.lang.annotation.Annotaion

  1. 宣告格式

    @元註解
    public @interface 註解名{
        引數型別 引數名();
    }
    
  2. 方法,實際上是宣告一個引數;

    • 方法名即引數名;
    • 方法返回值型別即引數返回值型別,且只能是基本型別
    • 可以通過 default 來宣告預設值,通常用空串和 0;
  3. 如果只有一個引數,引數名為 value。在使用註解的時候可以省略 value=""

例項1.1

  • @Documented:無
  • @Retention:原始碼範圍;
  • @Target:METHOD (方法);
  • @Inherited:無
  • 引數個數:2
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    int id();
    String name();
}

測試

  1. 註解只能在方法上使用,在其它位置使用會報錯

    • 在類上使用

    • 在本地變數使用

  2. 使用時必須給引數賦值,並且指明引數名(可以不按引數的宣告順序來賦值)

    • 不賦值 / 沒有全部賦值

    • 沒有指明引數名

例項1.2

  • 在例項1的基礎上,設定引數預設值。
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface MyAnnotation {

    int id() default 0;
    String name() default "";
}

測試

  • 沒有顯式賦值的引數,為預設值

  • 給部分引數賦值

例項2

  • @Documented:有
  • @Retention:執行時範圍;
  • @Target:TYPE (型別)、方法 (METHOD);(用陣列把多個級別括起來)
  • @Inherited:有
  • 引數個數:1,以 value 作為屬性名
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation2 {

    String value();
}

測試

  1. 在類、方法上方都可以使用;
  2. 使用時可以省略引數名:即無需指定 (value ="xxx") ,直接 ("xxx") 賦值。