用處
1:生成文檔
常用的有@see @param @return 等:2:跟蹤代碼依賴性,實現替代配置文件功能。比較常見的是sPRing 2.5 開始的基于注解配置。作用就是減少配置。現在的框架基本都使用了這種配置來減少配置文件的數量。以后java的程序開發,最多的也將實現注解配置,具有很大用處;3:”在編譯時進行格式檢查。如@override 放在方法前,如果你這個方法并不是覆蓋了超類方法,則編譯時就能檢查出。
api:
1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定類型的注解,如果該類型注解不存在,則返回null:
2:Annotation[] getAnnotations():返回該程序元素上存在的所有注解。3:boolean isAnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程序元素上是否包含指定類型的注解,存在則返回true,否則返回false.:
4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法將忽略繼承的注釋。(如果沒有注釋直接存在于此元素上,則返回長度為零的一個數組。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響。
demo1:
/******************************************************************************* ******************************************************************************/package test.annotation.field;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 水果顏色注解 * * @author peida */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitColor { /** * 顏色枚舉 */ public enum Color { BULE, RED, GREEN }; /** * 顏色屬性 * * @return */ Color fruitColor() default Color.GREEN;}/******************************************************************************* ******************************************************************************/package test.annotation.field;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 水果名稱注解 */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitName { String value() default "";}/******************************************************************************* ******************************************************************************/package test.annotation.field;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 水果供應者注解 */@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 "";}/******************************************************************************* ******************************************************************************/package test.annotation.field;import test.annotation.field.FruitColor.Color;public class Apple { @FruitName("Apple") private String appleName; @FruitColor(fruitColor = Color.RED) private String appleColor; @FruitProvider(id = 1, name = "陜西紅富士集團", address = "陜西省西安市延安路89號紅富士大廈") private String appleProvider;}/******************************************************************************* ******************************************************************************/package test.annotation.field;import java.lang.reflect.Field;public class AnnotationFiledTest { /** * @param args */ public static void main(final String[] args) { getFruitInfo(Apple.class); } public static void getFruitInfo(final Class<?> clazz) { String strFruitName = " 水果名稱:"; String strFruitColor = " 水果顏色:"; String strFruitProvicer = "供應商信息:"; final Field[] fields = clazz.getDeclaredFields(); for (final Field field : fields) { if (field.isAnnotationPresent(FruitName.class)) { final FruitName fruitName = field.getAnnotation(FruitName.class); strFruitName = strFruitName + fruitName.value(); System.out.println(strFruitName); } else if (field.isAnnotationPresent(FruitColor.class)) { final FruitColor fruitColor = field.getAnnotation(FruitColor.class); strFruitColor = strFruitColor + fruitColor.fruitColor().toString(); System.out.println(strFruitColor); } else if (field.isAnnotationPresent(FruitProvider.class)) { final FruitProvider fruitProvider = field.getAnnotation(FruitProvider.class); strFruitProvicer = strFruitProvicer + fruitProvider.id() + ";" + fruitProvider.name() + ";" + fruitProvider.address(); System.out.println(strFruitProvicer); } } }} 水果名稱:Apple 水果顏色:RED供應商信息:1;陜西紅富士集團;陜西省西安市延安路89號紅富士大廈demo2:
/******************************************************************************* ******************************************************************************/package test.annotation.method;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 定義一個注解 */@Target(ElementType.METHOD)// 這是一個對方法的注解,還可以是包、類、變量等很多東西@Retention(RetentionPolicy.RUNTIME)// 保留時間,一般注解就是為了框架開發時代替配置文件使用,JVM運行時用反射取參數處理,所以一般都為RUNTIME類型@Documented// 用于描述其它類型的annotation應該被作為被標注的程序成員的公共API,因此可以被例如javadoc此類的工具文檔化public @interface OneAnnotation { // 定義注解的參數,類型可以為基本類型以及String、Class、enum、數組等,default為默認值 String parameter1() default ""; int parameter2() default -1;}/******************************************************************************* ******************************************************************************/package test.annotation.method;/** * 一個用到了自定義的注解的類 */public class OneClass { @OneAnnotation(parameter1 = "YES", parameter2 = 10000) public void oneMethod() { }}/******************************************************************************* ******************************************************************************/package test.annotation.method;import java.lang.reflect.Method;public class AnnotationMethodTest { public static void main(final String[] args) throws Exception { // 提取到被注解的方法Method,這里用到了反射的知識 final Method method = Class.forName("test.annotation.method.OneClass").getDeclaredMethod("oneMethod"); // 從Method方法中通過方法getAnnotation獲得我們設置的注解 final OneAnnotation oneAnnotation = method.getAnnotation(OneAnnotation.class); // 得到注解的倆參數 System.out.println("para1: " + oneAnnotation.parameter1()); System.out.println("para2: " + oneAnnotation.parameter2()); }}para1: YESpara2: 10000。
新聞熱點
疑難解答