1. 程式人生 > >框架的基礎--全面解析java註解

框架的基礎--全面解析java註解

閱讀目錄

  1. 概念
  2. Java中的常見註解
  3. 註解的分類
  4. 自定義註解
  5. 註解的專案實戰
  6. 註解總結

java註解在java 1.5版本引入

一、概念

Java提供一種原程式中的元素關聯任何資訊和熱河元資料的途徑和方法。

二、Java中常見註解

  • jdk自帶的註解
    這裡寫圖片描述

    @Override 表示覆蓋或重寫父類的方法;
    @Deprecated 表示該方法已經過時了。 (當方法或類上面有@Deprecated註解時,說明該方法或是類都已經過期不能再用,但不影響以前專案使用,提醒你新替代的方法或是類。如果程式設計師不小心使用了它的元素,那麼編譯器會發出警告資訊。)
  • 第三方註解

    這裡寫圖片描述
    如andoird中ButterKnife框架的BindView

三、註解的分類

按照執行機制分(註解存在程式的哪個階段)將註解分為三類:
原始碼註解(只在原始碼中存在)、編譯註解(在class檔案中也存在)、執行時註解(在執行階段仍然起作用)

  • 原始碼註解: 註釋只在原始碼中存在,編譯成class檔案就不存在了。
  • 編譯時註解:jdk自帶的註解都是編譯時註解,註解在原始碼和.class檔案中 都存在。
  • 執行時註解:在執行階段還起作用,甚至會影響執行邏輯的註解。

按照來源來分的話有如下三類:
1. Jdk自帶的註解(Java目前只內建了三種標準註解:@Override、@Deprecated、@SuppressWarnings,以及四種元註解)
2.第三方註解–這一類註解我們解除最多和作用最大的一類
3.自定註解–也可以看做是我們編寫的註解,其他的都是他人編寫的註解。

按照功能來分的,還有,元註解–註解的註解。

四、自定註解

  1. 自定義註解的語法要求

    @Target(ElementType.METHOD,ElementType.Type)
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Description{
    
        String desc();
        String author();
        String age() default 18;
    
    }
    • 使用@interface關鍵字定義註解
    • 成員以無參無異常的方式宣告
    • 可以用default為成員制定一個預設值
    • 成員型別是受限的,合法的型別包括原始型別及String,Class,Annotation,Enumeration
    • 如果註解只有一個成員,則成員名必須取名為value(),在使用時可以忽略成員名和賦值號(=)
    • 註解類可以沒有成員,沒有成員的註解稱為標識註解

    2.元註解
    @Target 、@Retention @Inherited @Documented

    • @Target 是註釋的作用域: 表示該註解可以用於一個類中的哪些屬性及方法上,如果作用域型別有多個用英文逗號分隔

      下面是註解的作用域列表:
      CONSTRUCTOR:構造方法宣告
      FIELD: 欄位宣告
      LOCAL_VARIABLE:區域性變數宣告
      METHOD:方法宣告
      PACKAGE:包宣告
      PARAMETER:引數宣告
      TYPE:類介面

    • @Retention:表示註解的宣告週期

      註解按宣告週期有個分類
      SOURCE:只有在原始碼顯示,編譯時會丟棄
      CLASS:編譯時會記錄到class中,執行時忽略
      RUNTIME:執行時存在,可以通過反射讀取

    • @Inherited:此註解時標識性的元註解,表示當前註解可以由子註解來繼承

    • @Documented:表示成成javadoc的時候會包含註解

    3.使用自定註解
      使用註解的語法:
      @<註解名>(<成員名1>=<成員值1>,<成員名1>=<成員值1>,…)

     @Description(desc="i am eyecolor",author="Mooc boy",age=18)
     public String eyecolor(){
         return "red"
     }
    註解的定義看起來很像介面的定義,事實上,與其他任何java介面一樣,註解也會編譯成class檔案。
    定義註解時,會需要一些元註解(meta-annotation),如@target和@Retention。
    @Target用於定義你的註解用於什麼地方(例如是一個方法或一個域)。
    @Retention用於定於該註解在哪一個級別可用,在原始碼(SOURCE)、類檔案中(CLASS)或者執行時(RUNTIME)。
    

    4.解析註解
       概念:通過反射獲取類、函式或成員上執行時註解資訊,從而實現動態控制程式執行的邏輯。
    如:

public static void main(String[] args){
    try{
        //使用類載入器載入類
        Class c = Class.forName("com.wadexi.test.Child");
        //2.找到類上邊的註釋
        boolean isExist = c.AnnotationPresent(Description.class);
        if(isExist){
            Description d = c.getAnnotation(Description.class); 
            System.out.println(d.value());
        }
    }catch(ClassNotFoundException e){
        e.printStackTrace();
    }


}

使用forName()方法載入類,並使用getAnnotation(Description.class)檢查該類是否帶有@Description註解。
註解的繼承只能作用在類上,方法上的註解不會被繼承,Interface中的所有註解不會被繼承。

五、註解的專案實戰

需求:
1. 有一張使用者表,欄位包括使用者ID,使用者名稱,暱稱,年齡,性別,所在城市,郵箱,手機號。
2. 方便的對每個欄位或欄位的組合條件進行檢索,並打印出sql。
3. 使用方式要足夠簡單,見程式碼例項。

具體例項:
TestClass測試類:
這裡寫圖片描述

首先,考慮程式碼如何與資料庫進行對映。

這裡寫圖片描述

對註解@Table和@Column進行定義:
這裡寫圖片描述

這裡寫圖片描述

接下來考慮query()方法的實現:

這裡寫圖片描述

執行結果:
這裡寫圖片描述