天天看點

【面試加分項】java自己定義注解之解析注解

我之前的部落格中說明過自己定義注解的聲明今天我們來看看怎樣對我們自己定義的注解進行使用。

1.我們在程式中使用我們的注解。

上一篇中我們自己定義了一個注解:

@Target(ElementType.FIELD)//注解的作用範圍。就是注解是用在什麼地方的
@Retention(RetentionPolicy.RUNTIME)//注解的級别,就是注解能留存到什麼時候
@Documented
@Inherited
public @interface MyAnnotation {
    public String value();//注解能夠接收的參數
}           

這個注解僅僅有一個參數,是以我們在使用時不須要顯示說明參數名稱。以下我們寫一個類并使用注解。

public class People {
    @MyAnnotation("liu")
    private String name;
    public People() {
        Inject.injectfeild(this);
    }
    public String getName(){
        return name;
    }
}
           

大家能夠看到我們寫了一個類,并在他的上面寫了一個我們的注解,如果我們如今要實作的功能是把注解中的值指派給以下的屬性name,那我們該怎麼做呢。在這裡我們能夠看到我們在構造方法中調用了Inject.injectfeild(this),這種方法就是我們對注解進行解析。接下來我們就來看看詳細是怎樣做的。

2.對注解進行解析

廢話不多說先上代碼:

public class Inject {
    public static void injectfeild(Object o){
         Class<?> clazz = o.getClass();  //獲得傳進來的類
         Field[] fields = clazz.getDeclaredFields();//通過反射擷取類的域(全局變量)
         for (Field field : fields) { 
            // 檢視這個字段是否有我們自己定義的注解類标志的  
             if (field.isAnnotationPresent(MyAnnotation.class)) {  
                 MyAnnotation inject = field.getAnnotation(MyAnnotation.class);  //擷取到我們的注解
                 String value=inject.value();//擷取注解的參數
                 field.setAccessible(true);
                 try {
                    field.set(o, value);//為我們的字段指派
                } catch (IllegalArgumentException | IllegalAccessException e) {

                    e.printStackTrace();
                }
             }
         }
    }
}
           

事實上我們就是通過反射擷取了注解的值和相應的字段。在對他進行指派。以下我們再來看看測試:

public class Test {

    public static void main(String[] args) {
        People people=new People();
        System.out.println(people.getName());
    }

}