標籤:java 面試 自訂註解
我之前的部落格中說明過自訂註解的聲明今天我們來看看如何對我們自己定義的註解進行使用。
1.我們在程式中使用我們的註解。
上一篇中我們自訂了一個註解:
@Target(ElementType.FIELD)//註解的作用範圍,就是註解是用在什麼地方的@Retention(RetentionPolicy.RUNTIME)//註解的層級,就是註解能留存到什麼時候@Documented@Inheritedpublic @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自訂註解之解析註解