轉(zhuǎn)載自:http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html
如果沒有用來讀取注解的方法和工作,那么注解也就不會(huì)比注釋更有用處了狈定。使用注解的過程中谨设,很重要的一部分就是創(chuàng)建于使用注解處理器掠廓。Java SE5擴(kuò)展了反射機(jī)制的API婆瓜,以幫助程序員快速的構(gòu)造自定義注解處理器啄糙。
注解處理器類庫(java.lang.reflect.AnnotatedElement):
Java使用Annotation接口來代表程序元素前面的注解放刨,該接口是所有Annotation類型的父接口工秩。除此之外,Java在java.lang.reflect 包下新增了AnnotatedElement接口进统,該接口代表程序中可以接受注解的程序元素助币,該接口主要有如下幾個(gè)實(shí)現(xiàn)類:
- Class:類定義
- Constructor:構(gòu)造器定義
- Field:累的成員變量定義
- Method:類的方法定義
- Package:類的包定義
java.lang.reflect 包下主要包含一些實(shí)現(xiàn)反射功能的工具類,實(shí)際上螟碎,java.lang.reflect 包所有提供的反射API擴(kuò)充了讀取運(yùn)行時(shí)Annotation信息的能力眉菱。當(dāng)一個(gè)Annotation類型被定義為運(yùn)行時(shí)的Annotation后,該注解才能是運(yùn)行時(shí)可見掉分,當(dāng)class文件被裝載時(shí)被保存在class文件中的Annotation才會(huì)被虛擬機(jī)讀取俭缓。
AnnotatedElement 接口是所有程序元素(Class酥郭、Method和Constructor)的父接口华坦,所以程序通過反射獲取了某個(gè)類的AnnotatedElement對(duì)象之后,程序就可以調(diào)用該對(duì)象的如下四個(gè)個(gè)方法來訪問Annotation信息:
- <T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的不从、指定類型的注解惜姐,如果該類型注解不存在,則返回null消返。
- Annotation[] getAnnotations():返回該程序元素上存在的所有注解载弄。
- boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程序元素上是否包含指定類型的注解,存在則返回true撵颊,否則返回false.
- Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注釋宇攻。與此接口中的其他方法不同,該方法將忽略繼承的注釋倡勇。(如果沒有注釋直接存在于此元素上逞刷,則返回長度為零的一個(gè)數(shù)組。)該方法的調(diào)用者可以隨意修改返回的數(shù)組妻熊;這不會(huì)對(duì)其他調(diào)用者返回的數(shù)組產(chǎn)生任何影響夸浅。
一個(gè)簡單的注解處理器:
/***********注解聲明***************/
/**
* 水果名稱注解
* @author peida
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
String value() default "";
}
/**
* 水果顏色注解
* @author peida
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
/**
* 顏色枚舉
* @author peida
*
*/
public enum Color{ BULE,RED,GREEN};
/**
* 顏色屬性
* @return
*/
Color fruitColor() default Color.GREEN;
}
/**
* 水果供應(yīng)者注解
* @author peida
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
/**
* 供應(yīng)商編號(hào)
* @return
*/
public int id() default -1;
/**
* 供應(yīng)商名稱
* @return
*/
public String name() default "";
/**
* 供應(yīng)商地址
* @return
*/
public String address() default "";
}
/***********注解使用***************/
public class Apple {
@FruitName("Apple")
private String appleName;
@FruitColor(fruitColor=Color.RED)
private String appleColor;
@FruitProvider(id=1,name="陜西紅富士集團(tuán)",address="陜西省西安市延安路89號(hào)紅富士大廈")
private String appleProvider;
public void setAppleColor(String appleColor) {
this.appleColor = appleColor;
}
public String getAppleColor() {
return appleColor;
}
public void setAppleName(String appleName) {
this.appleName = appleName;
}
public String getAppleName() {
return appleName;
}
public void setAppleProvider(String appleProvider) {
this.appleProvider = appleProvider;
}
public String getAppleProvider() {
return appleProvider;
}
public void displayName(){
System.out.println("水果的名字是:蘋果");
}
}
/***********注解處理器***************/
public class FruitInfoUtil {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名稱:";
String strFruitColor=" 水果顏色:";
String strFruitProvicer="供應(yīng)商信息:";
Field[] fields = clazz.getDeclaredFields();
for(Field field :fields){
if(field.isAnnotationPresent(FruitName.class)){
FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);
strFruitName=strFruitName+fruitName.value();
System.out.println(strFruitName);
}
else if(field.isAnnotationPresent(FruitColor.class)){
FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class);
strFruitColor=strFruitColor+fruitColor.fruitColor().toString();
System.out.println(strFruitColor);
}
else if(field.isAnnotationPresent(FruitProvider.class)){
FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class);
strFruitProvicer=" 供應(yīng)商編號(hào):"+fruitProvider.id()+" 供應(yīng)商名稱:"+fruitProvider.name()+" 供應(yīng)商地址:"+fruitProvider.address();
System.out.println(strFruitProvicer);
}
}
}
}
/***********輸出結(jié)果***************/
public class FruitRun {
/**
* @param args
*/
public static void main(String[] args) {
FruitInfoUtil.getFruitInfo(Apple.class);
}
}
輸出結(jié)果:
水果名稱:Apple
水果顏色:RED
供應(yīng)商編號(hào):1 供應(yīng)商名稱:陜西紅富士集團(tuán) 供應(yīng)商地址:陜西省西安市延安路89號(hào)紅富士大廈