Java註解底層原理---實現一個簡單的註解

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():返回直接存在於此元素上的所有註釋。與此接口中的其他方法不同,該方法將忽略繼承的註釋。(如果沒有註釋直接存在於此元素上,則返回長度爲零的一個數組。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章