国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

利用注解完成變量自動初始化

LuDongWei / 591人閱讀

摘要:應用場景,某應用分為很多個模塊,為了簡化后續開發人員配置新模塊的工作,使項目維護更為容易,運用注解來對模塊進行初始化。模塊管理對模塊進行管理校園網校園網管理,因為沒有添加注解,不會被自動初始化而自動初始化是由來完成的。

利用注解完成對成員變量的自動初始化。應用場景,某應用分為很多個模塊,為了簡化后續開發人員配置新模塊的工作,使項目維護更為容易,運用注解來對模塊進行初始化。簡單修改后可以成為類似ButterKnife的工具。

區別在于ButterKnife的注解類型是@Retention(RetentionPolicy.SOURCE)的,即源代碼編譯階段發揮作用的注解,編譯完后就丟棄了。而我用的是@Retention(RetentionPolicy.RUNTIME),也是書上用到的,即運行時的再生效的注解,使用反射來完成注解所要達成的目標,有一定的性能損耗。

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的元素,如果應用該注解時,value元素是唯一需要賦值的元素,那么只需在括號內給出value元素所需的值即可
    String moduleName() default "";
    String moduleDes() default "";
}
ModuleSet 注解

用以標識包含ModuleEntry的對象的類,我們將對這個類中的帶有Module注解的元素進行自動初始化。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ModuleSet {
    String value();//其實這里的value沒有什么意義,是為了表示一下value元素的特殊,這點稍后會看到
}
Main函數

先看main函數,我最終想要實現的效果應該是其中的ModuleEntry對象都能根據注解自己初始化。

class Activity{}
@ModuleSet("Main")
class MainActivity extends Activity{
    @Module(id = 0,
            moduleName = "模塊管理",
            moduleDes = "對模塊進行管理")
    ModuleEntry mManagerModule;

    @Module(id = 1,
            moduleName = "校園網",
            moduleDes = "校園網管理")
    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來完成的。

ModuleHepler
public 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,輸出模塊對應的名字和描述
            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函數可以為當前的field實際代表的對象進行賦值,如果是static對象則可以把第一個參數置為null
                field.set(activity,moduleEntry);
                //使用get函數可以獲得這個對象
                //ModuleEntry moduleEntry0 = (ModuleEntry) field.get(activity);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
}

/**Output
class com.note.MainActivity
true
模塊管理 對模塊進行管理
mManagerModule
校園網 校園網管理
mSeunetModule
對模塊進行管理
*/

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66219.html

相關文章

  • 看起來很長但還是有用的Spring學習筆記

    摘要:關于依賴注入注入的注解提供的注解不僅僅是對象,還有在構造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進行縮小范圍的操作,最終能夠達到只有一個滿足所規定的限制條件。注解是使用限定符的主要方式。 本文首發于泊浮目的專欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業務對象。在大量Java EE的應用中,隨處可...

    DTeam 評論0 收藏0
  • 慕課網_《Spring入門篇》學習總結

    摘要:入門篇學習總結時間年月日星期三說明本文部分內容均來自慕課網。主要的功能是日志記錄,性能統計,安全控制,事務處理,異常處理等等。 《Spring入門篇》學習總結 時間:2017年1月18日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://git...

    Ververica 評論0 收藏0

發表評論

0條評論

LuDongWei

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<