@Retention是java當中的一個元注解,該元注解通常都是用於對軟件的測試
1、適用方式:
@Retention(RetentionPolicy.RUNTIME)
@interface Task{.......}
參數RetentionPolicy.RUNTIME就說明了,@Task注解在程序運行時是可見的
RetentionPolicy的枚舉類型還有SOURCE、CLASS分別指定注解對於那個級別是可見的,但是
我們一般都是用RUNTIME,因為這是在程序運行時可以對注解進行讀取,從而易於軟件的測試
2、接下來我們要先介紹一下java程序的內省和反射機制,之后在討論@Retention的具體用法實例
在java虛擬機JVM在運行時,就會將類進行加載,這時,每個類都會生成一個Class數據類型的
對象(Class類在java.lang.Class中),這個對象就是對應類的“運行時對象”,通過這個
運行時對象,就能夠獲取對應類的許多信息,也就是說,運行時對象實際就是對應類的一個映射
這就java的內省反射機制
3、接下來我們討論一下,這個Class運行時對象的使用
①獲取對應類的Class數據類型的運行時對象的引用——getClass()
public class Point{.....} //聲明一個類
Point pt = new Point(); //創建對應類的實例對象
Class cls = pt.getClass() ; //則cls 就指向了Point類的運行時對象
②運行時對象cls的成員函數
<1>public String getName()
返回對應類的類名
<2>public boolean isAnnotationPresent(注解名.class)
判定指定的"注解"是否在運行時注解了 cls 的對應類
<3>public boolean isAnnotation();
判定cls 是否在運行時被任何注解 注解過
<4>public A getAnnotation(注解名.class)
A 指的是一個注解的類型,具體用法如下:
@Retention(RetentionPolicy.RUNTIME) //指定@Task運行時可見
@interface Task{String descirption(); }
@Task(descroption="NoFinished") //為computer作注
class Computer{.....}
則 Computer my = new Computer() ;
Class cls = my.getClass() ;
Task tk = (Task) cls.getAnnotation(Task.class);
//這時 tk 就指向了標注Computer的注解@Task
tk.description(); //調用@Task中的description(),輸出"NoFinishing"
<5> public Method[] getMethods()
返回由對應類中的所有的方法形成的Method數組,每個Method對象都唯一對應
一個對應類中的方法,通過Method[i]就可以獲得對應方法的信息
(Method類在java.lang.reflect.Method中)
3、這個Method類也有很多成員方法,用來獲取對應的方法的信息
如也有:
public boolean isAnnotationPresent(注解名.class)
判定對應的方法是否被指定的注所注解
public A getAnnotation(注解名.class)
用法和上面的講述的一樣,之不過創建的注解型的引用變量指向的是 "標記對應方法的注解"
4、上面將所有的成員方法只有在注解運行時可見的情況下才能夠發揮作用,
所以@Retention變得很有用
@Retention的用法實例:
運行結果: