资讯专栏INFORMATION COLUMN

利用注解完成变量自动初始化

hyuan / 3357人阅读

摘要:应用场景,某应用分为很多个模块,为了简化后续开发人员配置新模块的工作,使项目维护更为容易,运用注解来对模块进行初始化。模块管理对模块进行管理校园网校园网管理,因为没有添加注解,不会被自动初始化而自动初始化是由来完成的。

利用注解完成对成员变量的自动初始化。应用场景,某应用分为很多个模块,为了简化后续开发人员配置新模块的工作,使项目维护更为容易,运用注解来对模块进行初始化。简单修改后可以成为类似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
对模块进行管理
*/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12981.html

相关文章

  • 利用注解完成变量自动始化

    摘要:应用场景,某应用分为很多个模块,为了简化后续开发人员配置新模块的工作,使项目维护更为容易,运用注解来对模块进行初始化。模块管理对模块进行管理校园网校园网管理,因为没有添加注解,不会被自动初始化而自动初始化是由来完成的。 利用注解完成对成员变量的自动初始化。应用场景,某应用分为很多个模块,为了简化后续开发人员配置新模块的工作,使项目维护更为容易,运用注解来对模块进行初始化。简单修改后可以...

    LuDongWei 评论0 收藏0
  • 看起来很长但还是有用的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
  • Android注解框架实战-ButterKnife

    摘要:另外在上还有提供一个插件,自动生成注解与类属性。跟一样是运行时利用反射去解析注释的框架还有等。市面上还有很多其他的注释框架,但是万变不离其宗,不是反射就是自动生成代码。文章大纲 Android注解框架介绍 ButterKnife实战 项目源码下载   一、框架介绍 为什么要用注解框架?  在Android开发过程中,我们经常性地需要操作组件,操作方法有findViewById,...

    sewerganger 评论0 收藏0
  • 神兵利器Dagger2

    摘要:方案我们手动以构造函数的方式注入依赖,将和作为参数传入而不是在的构造函数中去显示的创建。同样我们需要在类的成员变量上加上表示自己需要为自己提供依赖类的构造函数上的也需要去掉,应为现在不需要通过构造函数上的来提供依赖了。 Dagger-匕首,鼎鼎大名的Square公司旗下又一把利刃(没错!还有一把黄油刀,唤作ButterKnife);故此给本篇取名神兵利器Dagger2。 Dagger2...

    summerpxy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<