1. 程式人生 > >【面試加分項】java自己定義註解之解析註解

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

有一個 構造 ace catch .get doc 做的 document field

我之前的博客中說明過自己定義註解的聲明今天我們來看看怎樣對我們自己定義的註解進行使用。

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());
    }

}

結果:
liu

當然通常情況下一個普通的類的字段賦值我們能夠直接給他一個set函數,這個樣例僅僅是然大家理解怎樣進行自己定義註解。可是在很多框架中他們的屬性都是這樣進行賦值,原因是為了解耦,有興趣的能夠學習一下ioc的相關知識。


因為上傳到csdn的源代碼審核還沒過。須要源代碼的能夠在評論中留郵箱,我會盡快發過去。

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