什么是注解?
注解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK1.5及以后版本引入的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。
我們可以把注解理解為代碼里的特殊標記,這些標記可以在編譯,類加載,運行時被讀取,并執行相應的處理。通過注解,開發人員可以在不改變原有代碼和邏輯的情況下,在源代碼中嵌入補充信息。
1、注解的作用
編寫文檔:通過代碼里標識的注解生成文檔【生成文檔doc文檔】
代碼分析:通過代碼里標識的注解對代碼進行分析【使用反射】
編譯檢查:通過代碼里標識的注解讓編譯器能夠實現基本的編譯檢查【@Override】
2、JDK中預定義的注解
@Override
檢測被該注解標注的方法是否是繼承自父類(接口)的。
@Deprecated
該注解標識的內容,表示已過時,使用的時候,會有一個橫線。
SuppressWarnings
壓制警告,一般傳遞參數all @SuppressWarnings(“all”)。
(視頻教程推薦:java視頻)
3、自定義注解
格式
public @interface 注解名稱 { 屬性列表; }
本質:注解本質上就是一個接口,該接口默認繼承Annotation接口,可以通過javap 類名.class命令反編譯class文件
public interface MyAnno extends java.lang.annotation.Annotation { }
屬性:
注解中的屬性,就是接口中的抽象方法。
要求:
屬性的返回值類型只能是以下類型
基本數據類型
String
枚舉
注解
以上類型的數組
public @interface MyAnno { int age(); String name(); //枚舉類型 Person per(); //注解類型 MyAnno2 anno2(); //數組類型 String[] strs(); } //枚舉類Person public enum Person { P1,P2; }
注意:
定義了屬性,在使用時必須給屬性賦值,多個屬性之間用逗號隔開,所以,一般注解中方法名一般取成屬性名;
如果定義屬性時,使用default關鍵字給屬性默認初始化值,則使用時,可以不用給屬性賦值;
如果只有一個屬性需要賦值,并且屬性的名稱是value,則value可以省略,直接定義屬性值;
數組賦值時,值使用{}包裹。如果數組中只有一個值,則{}可以省略。
@MyAnno(age=20, name="zhangsan", per=Person.P1, anno2=@MyAnno2, strs={"zhangsan","lisi"}) public class Test { }
元注解:用于描述注解的注解
@Target
當前被描述的注解能夠作用的位置,該注解只有一個屬性是value,返回值是ElementType枚舉類型的數組。
ElementType 的常用值:
TYPE:可以作用于類上
METHOD:可以作用于方法上
FIELD:可以作用于成員變量上
@Rentention
描述注解被保留的階段,該注解只有一個屬性value,返回值是RetentionPolicy枚舉類型
RetentionPolicy 的值
SOURCE:當前被描述的注解,不會保留到class文件中
CLASS:當前被描述的注解,會保留到class字節碼文件中,但是不會被JVM讀取到
RUNTIME:當前被描述的注解,會保留到class字節碼文件中,并被JVM讀取到,自定義的值,一般都取這個值
@Documented
當前被描述的注解是否被抽取到api文檔中
@Inherited
當前被描述的描述注解是否被子類繼承
一般經常用到的是前兩個元注解。
4、注解的使用
在程序中使用注解:獲取這幾中定義的屬性值
// pro 注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface pro { String className(); String methodName(); } //在程序中使用注解 @pro(className="anli.Demo1", methodName = "show1") public class UseAnno { public static void main(String[] args) throws Exception { //獲取這個類的class對象 Class<UseAnno> useAnnoClass = UseAnno.class; //獲取指定的注解類子類對象 pro proAnno = useAnnoClass.getAnnotation(pro.class); //執行注解中的方法,獲取注解中屬性的值 String className = proAnno.className(); String methodName = proAnno.methodName(); }
通過Class類中的getAnnotation()方法,獲得的是注解類的實現類的對象,有了對象,就可以執行注解中的方法,返回值就是使用注解時設置的屬性值。其實就是在內存中生成了一個該注解接口的子類實現對象
public class ProImpl implements Pro{ public String className(){ return "cn.itcast.annotation.Demo1"; } public String methodName(){ return "show"; } }
推薦教程:java開發入門