框架的基礎--全面解析java註解
閱讀目錄
- 概念
- Java中的常見註解
- 註解的分類
- 自定義註解
- 註解的專案實戰
- 註解總結
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.自定註解–也可以看做是我們編寫的註解,其他的都是他人編寫的註解。
按照功能來分的,還有,元註解–註解的註解。
四、自定註解
自定義註解的語法要求
@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()方法的實現:
執行結果: