基于反射制作Ioc库(上)

原创 2015年07月07日 13:48:54
  1. 介绍
    在Android项目中,初始化View是必不可少的一部分,
    public final View findViewById (int id)或者Activity中的 public View findViewById (int id)需要我们手动的转换View类型,基于泛型对其简单封装
@SuppressWarnings("unchecked")
public static <T> T findViewById(Activity activity, int viewId) {
        return (T) activity.findViewById(viewId);
    }

@SuppressWarnings("unchecked")
public static <T> T findViewById(View viewParent, int viewId) {
        return (T) viewParent.findViewById(viewId);
}

但是在对View做单击、双击事件时仍然比较繁琐,下面我们开始基于反射制作我们自己的Ioc框架,Xutils、Andbase等原理类似。依赖注入具体到可以有构造注入、set函数注入、注解标注等,比较常用的就是基于注解标注的方式,在几个比较著名的依赖注入库中个人比较喜欢android annotations的注解名称,这里只以@ViewById 和 @Click为例

2. 注解定义和使用实例

@Retention(RetentionPolicy.RUNTIME) 表示注解保留到运行期
@Target(value = ElementType.FIELD) 表示注解只能标注在属性上
public @interface ViewById {
    int value() default 0;
}

@Retention(RetentionPolicy.RUNTIME)
@Target(value=ElementType.METHOD)
public @interface Click {
        int value() default 0;
}

使用实例

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

@Click(R.id.tv)
public void onTvClicked() {
    toast("ioc onClick");
}

@Click(R.id.tv)
public void onTvClicked(TextView tv) {
    tv.setText("ioc onClick");
}

3.核心方法的编写

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

上面在使用中仅仅对tv属性标注了注解,我们还需要在Activity运行时动态注入。

获取该Activity所有的属性信息

Class<? extends ActivityBase> clazz = getClass();
Field[] declaredFields = clazz.getDeclaredFields();

遍历其属性列表,找出标注了我们预定义的ViewById注解

for (Field field : declaredFields) {
            if (field.isAnnotationPresent(ViewById.class)) {
                ViewById annotationViewById = field.getAnnotation(ViewById.class);
                if (annotationViewById != null) {
                    ..............
                }
            }
}

通过注解获得Id信息,并把获取的View赋值给该属性

for (Field field : declaredFields) {
            if (field.isAnnotationPresent(ViewById.class)) {
                ViewById annotationViewById = field.getAnnotation(ViewById.class);
                if (annotationViewById != null) {
                    int viewId = annotationViewById.value();
                    field.setAccessible(true);
                    try {
                        field.set(this, findViewById(viewId));
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    }
                }
            }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

java利用反射机制模拟spring IOC实现

第一步:定义服务的配置文件(指定服务名和服务路径) 原创不易,转载请注明出处:java利用反射机制模拟spring IOC实现 代码下载地址:ht...
  • yaerfeng
  • yaerfeng
  • 2014年03月27日 12:23
  • 4401

Spring IOC原理之Java反射机制

1、反射概念以及为什么要使用反射 我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作? 那再考虑这样另一个场景,如果我们想要在运行期获得某个类Class的信息如它...
  • zhangliangzi
  • zhangliangzi
  • 2016年03月26日 10:17
  • 9517

Java反射机制在Spring IOC中的应用

IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 本篇文章主要讲解一下IOC底层实现的原理(反射),就不对IOC的...
  • mlc1218559742
  • mlc1218559742
  • 2016年10月10日 09:48
  • 4896

基于反射制作Ioc库(下)

介绍 在上一节我们已经完成了对ViewById注解的实现,从中我们可以发现先去获取Class声明的所有属性,然后遍历出带有我们预定义的注解的属性,我们自己在Activity子类声明的属性和Andr...
  • wchicho
  • wchicho
  • 2015年07月07日 14:27
  • 341

利用反射自实现IOC容器

  • 2017年12月26日 14:21
  • 14KB
  • 下载

Java仿Spring框架IOC控制反转利用反射简单实现(源码)

  • 2017年12月11日 11:19
  • 293KB
  • 下载

利用Java的反射与代理实现IOC模式

  • 2012年11月22日 08:15
  • 86KB
  • 下载

spring IOC反射装载bean

  • 2017年03月04日 15:46
  • 1.44MB
  • 下载

Java IOC及反射api代码参考实例

  • 2010年02月25日 16:05
  • 308KB
  • 下载

Java反射、泛型和注解实战之Spring核心注入IOC的实现

  • 2017年02月25日 19:12
  • 408KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于反射制作Ioc库(上)
举报原因:
原因补充:

(最多只允许输入30个字)