java中元註解有四個: @Retention @Target @Document @Inherited;
@Retention:註解的保留位置
@Retention(RetentionPolicy.SOURCE) //註解僅存在於源碼中,在class字節碼文件中不包含
@Retention(RetentionPolicy.CLASS) // 默認的保留策略,註解會在class字節碼文件中存在,但運行時無法獲得,
@Retention(RetentionPolicy.RUNTIME) // 註解會在class字節碼文件中存在,在運行時可以通過反射獲取到
@Target:註解的作用目標
@Target(ElementType.TYPE) //接口、類、枚舉、註解
@Target(ElementType.FIELD) //字段、枚舉的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法參數
@Target(ElementType.CONSTRUCTOR) //構造函數
@Target(ElementType.LOCAL_VARIABLE)//局部變量
@Target(ElementType.ANNOTATION_TYPE)//註解
@Target(ElementType.PACKAGE) ///包
@Document:說明該註解將被包含在javadoc中
@Inherited:說明子類可以繼承父類中的該註解
舉例:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface AnnatDemo{
public int value();
}
以上代碼定義了@AnnatDemo註解,作用目標是 用於對方法註解,並且保留在運行時的環境中,我們可以利用反射 獲得一個方法上的註解 調用定義的方法,
比如@AnnatDemo 作用於以下方法:
public interface IClientProtocolEx extends IProtocol {
int METHOD_START=0;
@AnnatDemo(METHOD_START)
public String say(String person);
}
那麼可以利用以下代碼進行反射:
Class ipt=IClientProtocalEx.class;
Method[] mts=ipt.getMethod();
for(Method mt:mts)
{
AnnatDemo ad=mt.getAnnotation(AnnatDemo.class);//如果方法上 沒有該註解 則返回null
int value=ad.value();
System.out.println("value:"+value);
}
註解是用於建設基礎jar包的一部分 項目都有自己的框架,若運用恰當,註解則爲其中良好的一部分!