什麼是註解?
註解(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開發入門
以上是如何更好地使用java註解的詳細內容。更多資訊請關注PHP中文網其他相關文章!