天天看點

Java-注解鞏固注解鞏固

注解鞏固

本篇筆記用鞏固Java注解基本概念,便于使用注解知識來學習如何編寫架構。

  1. 注解概述
    • Annotaion

      ,注解是插入代碼中的一種标記,在JDK1.5版本中引入。
    • Annotation 具備

      類型-對象

      的性質,可以存儲資料(這類資料通常稱為中繼資料,中繼資料就是資料中的資料)。
    • 在編譯和運作時期,我們可以對注解進行解析識别處理,用于達到功能解耦、代碼跟蹤(如:統計)、代碼規範檢查等目的。
    • 編譯時處理注解,使用預編譯工具。
    • 運作時處理注解,使用反射機制。
    • 注解可以加在

      字段

      方法

      方法的參數

      以及

      局部變量

      上。
  2. 注解分類
    1. Java内置注解

      java.lang 包中的注解類型:

      • Deprecated

        :過時,修飾已經過時的方法,成員,類。

        一般用此注解修飾的元素不推薦繼續使用,避免風險。

        Deprecated具有延續性,如果子類繼承了被Deprecated标記的類并且複寫了被标記為Deprecated的方法,在使用時則編譯器不會提示子類方法過時警告,如果隻是單純繼承了類,沒有複寫過時的方法,則編譯器會提示方法過時警告。被标記的過時類會一直被提示警告。

      • SupperessWarning

        :壓縮警告,通知編譯器壓制特定的編譯警告。

        一般來說,警告分為2種性質,一種是error(不可忽略的,如try catch 缺少一個catch塊),一種是warning(可壓制的,如這個方法是過時的)。

        @SupperessWarning 常見參數值:

        deprecation

        :使用了不贊成使用的類或方法時的警告;

        unchecked

        :執行了未檢查的轉換時的警告,例如當使用集合時沒有用泛型 (Generics) 來指定集合儲存的類型;

        fallthrough

        :當 Switch 程式塊直接通往下一種情況而沒有 Break 時的警告;

        path

        :在類路徑、源檔案路徑等中有不存在的路徑時的警告;

        serial

        :當在可序列化的類上缺少 serialVersionUID 定義時的警告;

        finally

        :任何 finally 子句不能正常完成時的警告;

        unused

        :代碼中的變量或方法沒有被使用産生的警告;

        rawtypes

        :使用泛型時沒有指定類型的警告;
      • Override

        :覆寫,重寫,用于修飾方法覆寫了父類的方法。
    2. 元注解(存在于在注解類型上的注解類型),通常是用來對其他注解類型作說明。

      java.lang.annotation包中的注解類型:

      • Documented

        :指定注解類型将通過javadoc和類似的預設工具進行文檔化。
      • Inherited

        :指定注解類型被自動繼承。
      • Retention

        :指定注解類型保持到哪個時期,也就是指定

        注解的生命周期

        注解的生命周期

        java源檔案階段(編譯時)——>>class檔案階段——>>記憶體中的位元組碼階段(運作時)
        @Retention 參數取值于枚舉類型:

        java.lang.annotation.ElementType

        SOURCE

        : 在源檔案中有效(即源檔案保留)

        CLASS

        : 在class檔案中有效(即class保留)

        RUNTIME

        : 在運作時有效(即運作時保留)
      • Target

        :指定注解類型适用的注解位置。

        如:@Target(ElementType.TYPE)。

        描述注解的修飾的範圍,指定注解可用于修飾package、類、接口、枚舉、注解、方法、構造方法、成員變量、枚舉值、方法參數、本地變量(如循環變量)。

        @Target 參數取值于枚舉類型:

        java.lang.annotation.RetentionPolicy

        CONSTRUCTOR

        : 用于描述構造器

        FIELD

        : 用于描述成員變量

        LOCAL_VARIABLE

        : 用于描述局部變量

        METHOD

        : 用于描述方法

        PACKAGE

        : 用于描述包

        PARAMETER

        : 用于描述參數

        TYPE

        : 用于描述類、接口(包括注解類型) 或enum聲明

        ANNOTATION_TYPE

        : 用于将注解定義為一個元注解
    3. 自定義的注解
      public @interface Color{ public String value() default “red”; }

      使用@interface聲明,其自動繼承了java.lang.annotation.Annotation接口,不需要也不能再繼承其他接口或注解。

      其中

      value()

      方法代表定義了一個屬性(一個注解可以有多個屬性),方法名稱

      value

      就是屬性的名稱,如果隻有一個方法/屬性,并且名稱必須為

      value

      ,則可以預設(如:@Color(“blue”)),

      default "red"

      是預設值。

      方法/屬性的值可以是基本資料類型、枚舉、注解,以及這些類型的數組類型。

  3. 運作時注解資訊解析識别

    當一個注解類型生命周期被定義為運作時存在時,該注解才是運作時可見的,

    AnnotatedElement

    接口是

    java.lang.reflect

    包中的一個接口,該接口是所有程式元素(Field、Method、Package、Class、Constructor)的父接口,通過反射擷取這些元素的

    AnnotatedElement對象

    ,進而使得

    java.lang.reflect

    包具有了讀取解析運作時注解的能力。

    AnnotatedElement對象 主要是調用以下API開解析程式元素的注解資訊:

    T getAnnotation(Class annotationClass)

    傳回該程式元素上存在的、指定類型的注解,如果該類型注解不存在,則傳回null ;   

    T getDeclaredAnnotation(Class)

    傳回該程式元素上存在的、指定類型的注解,如果該類型注解不存在,則傳回null;與此接口中的其他方法不同,該方法将忽略繼承的注解;

    Annotation[] getAnnotations()

    傳回該程式元素上存在的所有注解;

    Annotation[] getDeclaredAnnotations()

    傳回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法将忽略繼承的注解;

    Annotation[] getAnnotationsByType(Class)

    傳回直接存在于此元素上指定注解類型的所有注解;

    Annotation[] getDeclaredAnnotationsByType(Class)

    傳回直接存在于此元素上指定注解類型的所有注解。

    與此接口中的其他方法不同,該方法将忽略繼承的注解;

    boolean isAnnotationPresent(Class<?extends Annotation> annotationClass)

    判斷該程式元素上是否包含指定類型的注解,存在則傳回true,否則傳回false;
  4. JDK8.0新特性
    • 枚舉ElementType新增2個類型

      ElementType.TYPE_PARAMETER

      : 表示該注解能寫在類型變量的聲明語句中;

      ElementType.TYPE_USE

      : 表示該注解能寫在使用類型的任何語句中(例如聲明語句、泛型和強制轉換語句中的類型);
      @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
      public @interface Student{...}
                 
      使用形如:

      new @Interned Student();

        

      StudentA stuA = (@NonNull StudentA) stu;

      class Entity extends @Todo Serializable{ ... }

      void println() throws @ErrorApi ApiException { … }

      List<@Student T> query(...);

      這2個新增的類型,為新的設計和工具帶來了更多的機遇。
    • 新增

      @Repeatable

      注解

      該注解修飾賦予一個注解可以在程式元素上重複使用。

      public class Teacher{
          @Authority(role="ban zhu ren")
          @Authority(role="xiao zhang")
          public String role;
      }