如果沒有用來讀取註解的方法和工作,那麼註解也就不會比註釋更有用處了。使用註解的過程中,很重要的一部分就是創建於使用註解處理器。 JavaSE5擴展了反射機制的API,以幫助程序員快速的構造自定義註解處理器。
註解處理器類庫(java.lang.reflect.AnnotatedElement):
Java使用Annotation接口來代表程序元素前面的註解,該接口是所有Annotation類型的父接口。除此之外,Java在java.lang.reflect包下新增了AnnotatedElement接口,該接口代表程序中可以接受註解的程序元素,該接口主要有如下幾個實現類:
Class:類定義
Constructor:構造器定義
Field:累的成員變量定義
Method:類的方法定義
Package:類的包定義
java.lang.reflect包下主要包含一些實現反射功能的工具類,實際上,java.lang.reflect包所有提供的反射API擴充了讀取運行時Annotation信息的能力。當一個Annotation類型被定義為運行時的Annotation後,該註解才能是運行時可見,當class文件被裝載時被保存在class文件中的Annotation才會被虛擬機讀取。
AnnotatedElement接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通過反射獲取了某個類的AnnotatedElement對象之後,程序就可以調用該對象的如下四個個方法來訪問Annotation信息:
方法1:<TextendsAnnotation>TgetAnnotation(Class<T>annotationClass):返回改程序元素上存在的、指定類型的註解,如果該類型註解不存在,則返回null。
方法2:Annotation[]getAnnotations():返回該程序元素上存在的所有註解。
方法3:booleanisAnnotationPresent(Class<?extendsAnnotation>annotationClass):判斷該程序元素上是否包含指定類型的註解,存在則返回true,否則返回false.
方法4:Annotation[]getDeclaredAnnotations():返回直接存在於此元素上的所有註釋。與此接口中的其他方法不同,該方法將忽略繼承的註釋。 (如果沒有註釋直接存在於此元素上,則返回長度為零的一個數組。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響。
一個簡單的註解處理器:
/***********註解聲明***************//** * 水果名稱註解* @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitName {String value() default "";}/** * 水果顏色註解* @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitColor {/** * 顏色枚舉* @author peida * */public enum Color{BULE,RED,GREEN};/** * 顏色屬性* @return */Color fruitColor() default Color.GREEN;}/** * 水果供應者註解* @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitProvider {/** * 供應商編號* @return */public int id() default -1;/** * 供應商名稱* @return */public String name() default "";/** * 供應商地址* @return */public String address() default "";}/***********註解使用***************/public class Apple {@FruitName("Apple") private String appleName;@FruitColor(fruitColor=Color.RED) private String appleColor;@FruitProvider(id=1,name="陝西紅富士集團",address="陝西省西安市延安路89號紅富士大廈") 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="供應商信息:";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=" 供應商編號:"+fruitProvider.id()+" 供應商名稱:"+fruitProvider.name()+" 供應商地址:"+fruitProvider.address();System.out.println(strFruitProvicer);}}}}/***********輸出結果***************/public class FruitRun {/** * @param args */public static void main(String[] args) {FruitInfoUtil.getFruitInfo(Apple.class);}}==================================== 水果名稱:Apple 水果顏色:RED 供應商編號:1 供應商名稱:陝西紅富士集團供應商地址:陝西省西安市延安路89號紅富士大廈Java註解的基礎知識點(見下面導圖)基本都過了一遍,下一篇我們通過設計一個基於註解的簡單的ORM框架,來綜合應用和進一步加深對註解的各個知識點的理解和運用。
總結
以上就是本文關於Java註解處理器簡單實例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!