摘要:應(yīng)用場景,某應(yīng)用分為很多個模塊,為了簡化后續(xù)開發(fā)人員配置新模塊的工作,使項目維護(hù)更為容易,運(yùn)用注解來對模塊進(jìn)行初始化。模塊管理對模塊進(jìn)行管理校園網(wǎng)校園網(wǎng)管理,因為沒有添加注解,不會被自動初始化而自動初始化是由來完成的。
利用注解完成對成員變量的自動初始化。應(yīng)用場景,某應(yīng)用分為很多個模塊,為了簡化后續(xù)開發(fā)人員配置新模塊的工作,使項目維護(hù)更為容易,運(yùn)用注解來對模塊進(jìn)行初始化。簡單修改后可以成為類似ButterKnife的工具。
區(qū)別在于ButterKnife的注解類型是@Retention(RetentionPolicy.SOURCE)的,即源代碼編譯階段發(fā)揮作用的注解,編譯完后就丟棄了。而我用的是@Retention(RetentionPolicy.RUNTIME),也是書上用到的,即運(yùn)行時的再生效的注解,使用反射來完成注解所要達(dá)成的目標(biāo),有一定的性能損耗。
ModuleEntry先來看ModuleEntry類,每個該類對象表示一個模塊。
public class ModuleEntry { int id; String name; String des; public ModuleEntry(int id, String name, String des) { this.id = id; this.name = name; this.des = des; } }Module注解
@Target(ElementType.FIELD) @Retention(RetentionPolicy.SOURCE) public @interface Module { int id(); //String value();//注意注解中名為value的元素,如果應(yīng)用該注解時,value元素是唯一需要賦值的元素,那么只需在括號內(nèi)給出value元素所需的值即可 String moduleName() default ""; String moduleDes() default ""; }ModuleSet 注解
用以標(biāo)識包含ModuleEntry的對象的類,我們將對這個類中的帶有Module注解的元素進(jìn)行自動初始化。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface ModuleSet { String value();//其實這里的value沒有什么意義,是為了表示一下value元素的特殊,這點(diǎn)稍后會看到 }Main函數(shù)
先看main函數(shù),我最終想要實現(xiàn)的效果應(yīng)該是其中的ModuleEntry對象都能根據(jù)注解自己初始化。
class Activity{} @ModuleSet("Main") class MainActivity extends Activity{ @Module(id = 0, moduleName = "模塊管理", moduleDes = "對模塊進(jìn)行管理") ModuleEntry mManagerModule; @Module(id = 1, moduleName = "校園網(wǎng)", moduleDes = "校園網(wǎng)管理") ModuleEntry mSeunetModule; ModuleEntry mOtherModule; public MainActivity(){ ModuleHelper.configureModule(this); } } public class Main{ public static void main(String[] args){ MainActivity mainActivity = new MainActivity(); System.out.println(mainActivity.mManagerModule.des); //NullPointerException,因為mOtherModule沒有添加注解,不會被自動初始化 //System.out.println(mainActivity.mOtherModule.des); } }
而自動初始化是由ModuleHelper來完成的。
ModuleHeplerpublic class ModuleHelper { public static void configureModule(Activity activity){ //輸出傳入對象類型 System.out.println(activity.getClass()); //查看其是否添加了ModuleSet注解并獲取注解 System.out.println(activity.getClass().isAnnotationPresent(ModuleSet.class)); ModuleSet moduleSetAnnotation = activity.getClass().getAnnotation(ModuleSet.class); //必須添加了該注解的類才能使用這個方法,否則不做任何操作 if (moduleSetAnnotation == null)return; //遍歷所有的域 for (Field field : activity.getClass().getDeclaredFields()){ Module module = field.getAnnotation(Module.class); //如果沒有模塊注解,或者其類型不是模塊實體,則跳過 if(module == null || field.getType() != ModuleEntry.class)continue; //對所有的滿足條件的Field,輸出模塊對應(yīng)的名字和描述 System.out.println(module.moduleName() + " " + module.moduleDes()); System.out.println(field.getName()); //生成模塊條目 ModuleEntry moduleEntry = new ModuleEntry(module.id(),module.moduleName(),module.moduleDes()); try { field.setAccessible(true); //使用set函數(shù)可以為當(dāng)前的field實際代表的對象進(jìn)行賦值,如果是static對象則可以把第一個參數(shù)置為null field.set(activity,moduleEntry); //使用get函數(shù)可以獲得這個對象 //ModuleEntry moduleEntry0 = (ModuleEntry) field.get(activity); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } /**Output class com.note.MainActivity true 模塊管理 對模塊進(jìn)行管理 mManagerModule 校園網(wǎng) 校園網(wǎng)管理 mSeunetModule 對模塊進(jìn)行管理 */
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/66219.html
摘要:關(guān)于依賴注入注入的注解提供的注解不僅僅是對象,還有在構(gòu)造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進(jìn)行縮小范圍的操作,最終能夠達(dá)到只有一個滿足所規(guī)定的限制條件。注解是使用限定符的主要方式。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業(yè)務(wù)對象。在大量Java EE的應(yīng)用中,隨處可...
摘要:入門篇學(xué)習(xí)總結(jié)時間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計,安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個人學(xué)習(xí)源碼:https://git...
閱讀 3340·2021-11-02 14:44
閱讀 3782·2021-09-02 15:41
閱讀 1785·2019-08-29 16:57
閱讀 1852·2019-08-26 13:38
閱讀 3366·2019-08-23 18:13
閱讀 2164·2019-08-23 15:41
閱讀 1728·2019-08-23 14:24
閱讀 3091·2019-08-23 14:03