標籤:
一、註解中的資訊已經在Class中了,我們應該如何讀取出來
1 java.lang.reflect.AnnotatedElement介面:2 3 public Annotation[] getAnnotation(Class annotationType);4 5 public Annotation[] getDeclaredAnnotations();6 7 public Boolean isAnnotationPresent(Class annotationType);
View Code
Class 、Constructor、Field、Method、Package等類別,都實現了AnnotatedElement介面,既然Class 、Constructor、Field、Method、Package等類別,都實現了AnnotatedElement介面,顯然它們都可以去調用AnnotatedElement裡面的方法,以上各方法是定義在這個介面中的,定義Annotation時必須設定RententionPolicy為RUNTIME,也就是可以在VM中讀取Annotation資訊
二、通過反射的方式讀取作用在類、方法上面所修飾的註解資訊。
1、public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
這句代碼錶示:annotationClass指定的註解,如果存在於方法的上面,就返回一個true,這個方法主要是用來判斷某個方法上面是否存在註解。
2、public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
會返回一個Annotation這樣一個對象,參數裡邊兒是一個具體的Annotation Class對象,如果這樣一個Annotation存在的話,才會返回這個Annotation。否則返回一個空值
3、Class<? extends Annotation> annotationType()
返回註解所對應的Class對象。
三、限定annotation使用對象
@Target
使用java.lang.annotation.Target可以定義其使用之時機,就是限定可以在什麼地方可以使用註解:如方法、類、成員屬性、變數,在定義時要指定java.lang.annotation.ElementType的枚舉值之一,以此來表示這個註解可以修飾哪些目標。
package java.lang.annotation
public Enum ElementType{
TYPE,//適用class,interface,enum
FIELD,//適用field
METHOD,//適用method
PARAMETER,//適用method之上的parater
CONSTTRUCTOR,//適用constructor
LOCAL_VARIABLE,//適用局部變數
ANNOTATION_TYPE,//適用annotation型態
PACKAGE//適用package
}
1 package com.javase.annotation; 2 import java.lang.annotation.ElementType; 3 import java.lang.annotation.Target; 4 /** 5 * 自訂一個註解,這個註解只能修飾方法 6 * @author x_xiongjie 7 * 8 */ 9 @Target(ElementType.METHOD)10 public @interface MyTarget {11 String value();12 }13 14 package com.javase.annotation;15 16 public class MyTargetTest {17 @MyTarget(value="zhangsan")18 public void doSomething(){19 System.out.println("hello world");20 }21 }
View Code四、要求為API檔案@Documented
在製作JavaDoc檔案的同時,如果想要將Annotation的內容也加入到API檔案中,需要使用java.lang.annotation.Documented,則在在產生java doc的時候,將註解資訊也產生到java doc中。
1 package com.javase.annotation; 2 import java.lang.annotation.Documented; 3 4 @Documented 5 public @interface DocumentedAnnotation { 6 String hello(); 7 } 8 package com.javase.annotation; 9 10 public class DocumentedTest {11 @DocumentedAnnotation(hello="welcome")12 public void method(){13 System.out.println("helloworld");14 }15 }
View Code五、@Inherited
在定義Annotation時加上java.lang.annotation.Inherited形態的Annotation,Inherited表示一個註解資訊是否可以被自動繼承下來,如果在註解中加上Inherited註解,就會由父類中被子類繼承下來。
六:總結
1、要知道註解的本源是什麼,如何去定義註解。
2、如何使用反射的方式去解析註解的資訊,並且去解析註解下面所修飾的類、方法。根據註解是否存在註解的值到底是什麼,來去調用對應的方法,或者處理對應的類。這個是很重要的,將RetentionPolicy設定為RUNTIME就可以得到。
Java 註解機制