import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class Test01{
//定義註解生命週期
@Retention(RetentionPolicy.RUNTIME)
static @interface wyf{
String name() default "一帆";
String sex() default "男";
}
@wyf(name = "XXXX")
static class A{
String nam;
String sex;
}
public static void main(String[] args) {
if(A.class.isAnnotationPresent(wyf.class))
{
wyf w = A.class.getAnnotation(wyf.class); //反射的方式獲取wyf註解的對象
System.out.println(w.name()+" "+w.sex());
}
}
}
註解底層實現-------註解處理器
這個是註解使用的核心了,前面我們說了那麼多註解相關的,那到底java是如何去處理這些註解的呢
從getAnnotation進去可以看到java.lang.class實現了AnnotatedElement方法
MyAnTargetType t = AnnotationTest.class.getAnnotation(MyAnTargetType.class);
public final class Class<T> implements java.io.Serializable,
GenericDeclaration,
Type,
AnnotatedElement
java.lang.reflect.AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通過反射獲取了某個類的AnnotatedElement對象之後,程序就可以調用該對象的如下四個個方法來訪問Annotation信息:
方法1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定類型的註解,如果該類型註解不存在,則返回null。
方法2:Annotation[] getAnnotations():返回該程序元素上存在的所有註解。
方法3:boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程序元素上是否包含指定類型的註解,存在則返回true,否則返回false.
方法4:Annotation[] getDeclaredAnnotations():返回直接存在於此元素上的所有註釋。與此接口中的其他方法不同,該方法將忽略繼承的註釋。(如果沒有註釋直接存在於此元素上,則返回長度爲零的一個數組。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響