我之前的博客中說明過自定義註解的聲明今天我們來看看如何對我們自己定義的註解進行使用。
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的源碼審覈還沒過,需要源碼的可以在評論中留郵箱,我會盡快發過去。