(源码阅读)自己动手打造一套属于自己想IOC注解框架

       阅读过Xutils3和butterKnife的源码之后,稍微比对了一下,俩个都写的非常nb~~

          Xutils3通过源码发现,主要是通过反射去 获得属性,函数进行注入。

          而butterKnife通过将一系列的参数拼接起来重新生成一个.java文件打包到apk里面。

         so,我们还是来通过反射的方式打造自己的IOC注解框架吧。

public static void inject(ViewFinder finder , Object object){

    injectFiled(finder , object);   //属性注入
    injectEvent(finder , object);   //函数注入

}

private static void injectFiled(ViewFinder finder, Object object) {
    //1:获取类里面的所有属性
    Class<?> clazz = object.getClass();
    //获取类里面的所有属性集合
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields){
        //拿到类里面的属性上面的Annotation
        ViewById viewById = field.getAnnotation(ViewById.class);
        //2:获取ViewById的里面的resId的值
        if (viewById != null ){
            //拿到Annotation里面的resId值
            int viewId = viewById.value();
            //3:findViewById找到里面的View
            View view = finder.findViewById(viewId);

            if (view != null) {
                //4:动态注入找到的View
                field.setAccessible(true);
                try {
                    field.set(object, view);
                } catch (IllegalAccessException e) {
                    Log.e("--->", "ViewUtils inject failure..");
                    e.printStackTrace();
                }
            }
        }

    }
跟Xutils3的做法类似,通过反射去拿到当前类,再获得所有属性,对所有属性进行遍历,判断是否带有Annotation,拿到带有Annotation的属性进行View的注入、到这里,我们就完成了属性的注入了,我们在使用的时候就只需要

@ViewById(R.id.id_text)
private TextView tv;

这样就像Xutils一样完成了属性的注入了,使用的时候

tv.setText("嘿嘿");
也不会出现空指针了~~~下面我们来看下点击函数的注入吧。

private static void injectEvent(ViewFinder finder, Object object) {

    Class<?> clazz = object.getClass();

    Method[] methods = clazz.getDeclaredMethods();

    for (Method method : methods) {

        OnClick clickMethod = method.getAnnotation(OnClick.class);

        if (clickMethod != null){
            int[] viewIds = clickMethod.value();
            for (int viewId : viewIds) {
                View view = finder.findViewById(viewId);

                boolean isCheckNet = method.getAnnotation(CheckNet.class) != null;
                if (view != null) {
                    view.setOnClickListener(new DeclaredOnClickListener(method, object, isCheckNet));
                }
            }
        }
    }
}
这里的原理和属性注入也是一样的,拿到带有Annotation的View之后,通过view.setOnClickListener来设置点击事件,在点击事件里通过反射去执行我们平时的OnClickListener(),到这里有没有觉得我们所使用的注解框架就是这么简单呢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自己动手框架是一种非常有挑战性的任务,尤其是对于 ORM(对象关系映射)、MVC(模型-视图-控制器)和IOC(控制反转)这三个框架而言。以下是对这三个框架的简要介绍,以及它们的实现过程。 首先,ORM(对象关系映射)框架是用于将数据库中的表映射为对象的一种技术。在实现ORM框架时,需要定义对象和表之间的映射关系,并提供相应的API来进行数据库的增删改查操作。还需要处理对象之间的关联关系(如一对一、一对多等),并提供事务管理、缓存等功能。 其次,MVC(模型-视图-控制器)框架是一种用于开发Web应用程序的架构模式,将应用程序分为模型、视图和控制器三层。在实现MVC框架时,需要定义模型、视图和控制器的接口,并提供相应的实现。模型负责处理数据逻辑,视图负责展示用户界面,而控制器则负责接收用户请求并进行处理,最后将结果返回给视图进行展示。 最后,IOC(控制反转)框架是一种通过依赖注入来管理对象之间的依赖关系的技术。在实现IOC框架时,需要定义依赖注入的规则,并提供相应的实现。可以使用反射机制来自动实例化对象,并将依赖的对象注入到目标对象中。还需要提供对象的生命周期管理(如单例模式、原型模式等)和对象的配置方式(如XML配置、注解配置等)。 总结来说,自己动手实现ORM、MVC和IOC框架需要掌握相关的技术和知识,并具备良好的设计和编码能力。除了理论知识外,还需要具备实际项目的经验,以便能够更好地设计和实现这些框架。同时,也需要不断学习和改进,跟上技术的发展潮流,以确保框架的高效和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值