以下為本人的學習筆記
1.認識Annotation
??JDK1.5開始,java增加了對元資料(即類的組成單元資料)的支持,也就是(Annotation)注解,它是代碼里做的特殊標記,這些標記可以在編譯,類加載,運行時在不改變原有邏輯的情況下,被讀取(通過反射來讀取),并執行相應 的處理,通過使用Annotation,程式員可以在源檔案中嵌入一些補充從資訊,代碼分析工具,開發工具和部署工具可以通過這些補充資訊進行驗證或者進行部署,Annotation類似于修飾符一樣被使用,可以用于包,類,構造方法,方法,成員變數,區域變數的宣告,
??元資料可以說是一個屬性,解釋資料的資料,如一個屬性age的值為18,那么這個解釋18的欄位age就是元資料,
??注解也可以說是一個描述資訊,把資訊再決議,
??注解的本質是標記,他所有的功能都依賴于對于這個注解解釋性的代碼,通常需要結合反射來撰寫解釋下代碼,
注意:
Annotation是一個介面
java.lang.Annotation介面
2.系統定義的Annotation
在JDK1.5之后,在系統中提供了三個Annotation,分別是:@Override(譯:覆寫)、@Deprecated(譯:已棄用)、@SupperssWarings,
@Override
表示驗證當前的方法是否覆寫超類中的方法(即重寫父類方法),如果你一不小心拼寫錯誤,或者方法簽名對不上被覆寫的方法,編譯器就會發出錯誤提示
@Deprecated
表示的是一個類或方法已經不再建議繼續使用了,標記為已過時
@SupperssWarings
表示關閉不當的編譯器警告資訊
| Annotation | 說明 |
|---|---|
| @SupperssWarings("unchecked") | 未檢查的轉化,如集合沒有指定型別 |
| @SupperssWarings("unused") | 未使用的變數 |
| @SupperssWarings("resource") | 有泛型未指定型別 |
| @SupperssWarings("path") | 在類路徑,原檔案路徑中有不存在的路徑 |
| @SupperssWarings("deprecation") | 使用了某些不贊成使用的類和方法 |
| @SupperssWarings("fallthrough") | switch陳述句執行到底沒有break關鍵字 |
| @SupperssWarings("serial") | 某類實作Serializable但是沒有定義serialVersionUID這個需要但是不必須的欄位 |
| @SupperssWarings("rawtypes") | 沒有傳遞帶有泛型的引數 |
| @SupperssWarings("all") | 全部型別的警告(用這一條就夠了) |
3.自定義Annotation
注解應用三個步驟:
1)撰寫注解
2)在類上應用注解
3)對應用了注解的類進行反射操作的類
自定義Annotation的語法如下:
訪問控制權限@interface Annotation 名稱{}
@interface : 定義一個注解的關鍵字
例如:
public @interface MyAnnotation{}
//1.自定義注解
//表示該注解的作用范圍在運行時存在
@Retention(RetentionPolicy.RUNTIME)
//用于生成檔案
@Documented
//用于表示注解的應用范圍(型別,方法,屬性,構造器,引數,區域變數,包,Annotation)
@Target(ElementType.TYPE)
@Inherited//子類可繼承
public @interface MyAnnotation{
//定義變數,注意:變數后要加括號(),且呼叫此注解時必須設定變數名
public String name();
public int age() default 2;//給變數設定默認值
public String[] like();//定義一個陣列,呼叫此注解時變數名要含大括號{}
public COlor color();//定義一個列舉型別的變數
}
?
public enum Color{
RED,GREEN,BLUE;
}
//2.使用注解
@MyAnnotation(name="wan",like = {"金魚","草魚"},color = Color.RED)
public class Cat{
private String name;
private int age;
public String[] like;
private Color color;
...(構造方法,getter(),setter())
}
public class AnnotationDemo{
/**
反射來處理注解
*/
@Test
public void test2(){
Class<Cat> catClass = Cat.class;
//獲取類上應用的指定注解
MyAnnotation annotation = CatClass.getAnnotation(MyAnnotation.class);
//獲取注解上變數值
String name = annotation.name();
int age = annotation.age();
Color color = annotation.color();
String[] like = annotation.like();
try{
//通過反射實體化物件,呼叫物件的方法存盤注解上的值
Cat cat =catClass.newInstance();
cat.setName(name);
cat.setAge(age);
cat.setLike(like);
cat.setColor(color);
System.out.println(cat);
}catch(InstantiationException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}
?
}
}
4.Retention和RetentionPolicy
Annotation要想決定其作用的范圍,通過@Retention(譯:保持)指定,而Retention指定的范圍由RetentionPolicy(policy,譯:方針,政策,原則)決定,RetentionPolicy指定了三種范圍:
| 范圍 | 說明 |
|---|---|
| public static final RetentionPolicy SOURCE | 在java源程式中存在(提供給編譯器使用) |
| public static final RetentionPolicy CLASS | 在java生成的class存在 |
| public static final RetentionPolicy RUNTIEM | 在java運行的時候存在(我們通常使用這個范圍) |
示例:
@Retention(value = https://www.cnblogs.com/lyh1024/archive/2022/10/28/RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
public String name();
}
5.反射與Annotation
一個Annotation真正起作用,必須結合反射機制,在反射中提供了以下的操作方法:
java.lang.reflect.AccessibleObject(供虛擬機使用)
| Method | 說明 |
|---|---|
| public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) (present,譯:目前,出現) | 判斷是否是指定的Annotation |
| public Annotation[] getAnnotations() | 得到全部的Annotation |
注解在目前而言最主流的應用就是代替組態檔,例如Spring、SpringBoot等,注解具有開發效率高,成本低的特點,缺點是耦合性高,不利于維護
6.@Documented注解
此注解表示的是檔案化,可以在生成doc檔案的時候添加注解,即生成檔案時,注釋一起生成
7.@Target注解
@Target注解(用來注釋注解)表示的是一個Annotation的使用范圍,例如:之前定義的MyAnnotation可以在任意的位置上使用(沒有寫這個注解,就所有地方可以使用)
| 范圍 | 說明 |
|---|---|
| public static final ElementType TYPE | 只能在類或介面或列舉上使用 |
| public static final ElementType FIELD | 在成員變數中使用 |
| public static final ElementType METHOD | 在方法中使用 |
| public static final ElementType PARAMETER | 在引數上使用 |
| public static final ElementType CONSTRUCTOR | 在構造中使用 |
| public static final ElementType LOCAL_VARIABLE | 區域變數上使用 |
| public static final ElementType ANNOTATION_TYPE | 只能在Annotation中使用 |
| public static final ElementType PACKAGE | 只能在包中使用 |
8.@Inherited注解
@Inherited表示一個Annotation是否允許被其子類繼承下來(使用時表示允許)
■免責申明
⒈ 本站是純粹個人學習網站,與朋友交流共賞,不存在任何商業目的,
⒉ 本站利用了部分網路資源,著作權歸原作者及網站所有,如果您對本站所載文章及作品著作權的歸屬存有異議,請立即通知我們,我們將在第一時間予以洗掉,同時向你表示歉意!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522907.html
標籤:其他
