基于反射制作Ioc库(下)

原创 2015年07月07日 14:27:35
  • 介绍
    在上一节我们已经完成了对ViewById注解的实现,从中我们可以发现先去获取Class声明的所有属性,然后遍历出带有我们预定义的注解的属性,我们自己在Activity子类声明的属性和Android Sdk自带Activity的属性其数量可想而知,这也是基于反射Ioc效率比较低下的原因,只有知道效率低的原因才可以对其改进,我们会在以后的文章中持续对其改进。在这里我们继续完成对Click注解的实现
  • 核心方法编写

  • 获取Class的所有方法

Method[] declaredMethods = clazz.getDeclaredMethods();
  • 遍历方法列表,找出带有Click注解的方法
for (Method method : declaredMethods) {
            if (method.isAnnotationPresent(Click.class)) {
                Click annotationClick = method.getAnnotation(Click.class);
                if (annotationClick != null) {
                    int viewId = annotationClick.value();
                    method.setAccessible(true);
                    View viewTarget =findViewById(viewId);
                    viewTarget.setTag(R.id.base_ioc_method_id, method);
                    viewTarget.setOnClickListener(iocListener);
                }
            }
        }

由于我们仅仅是为了说明原理,其中viewTarget.setTag(R.id.base_ioc_method_id, method);方法是通过唯一的id传递我们的方法Method,Andbase中支持点击事件类型比较多,是通过动态代理的方式实现。下面是iocListener部分

private OnClickListener iocListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            Method method = (Method) v.getTag(R.id.base_ioc_method_id);
            Class<?>[] parameterTypes = method.getParameterTypes();
            try {
                if (parameterTypes == null || parameterTypes.length == 0) {
                    Object[] objs = {};
                    method.invoke(ActivityBase.this, objs);
                } else if (parameterTypes.length == 1  &&View.class.isAssignableFrom(parameterTypes[0])) {
                    method.invoke(ActivityBase.this, v);
                } else {
                    throw new IllegalArgumentException("activitybase ioc param error");
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    };

在onClick方法具体实现中,首先判断我们在Activity中声明的方法

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

在这里我们并不需要TextView实例,但是有时候我们需要TextView的实例从而更新它的UI表现

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

所以在onClick中我们首先判断该Method的参数列表信息,如果需要View是实例我们就调用
method.invoke(this, v) 否则就调用method.invoke(this, new Object);

- 小结
到这里我们就完成了ViewById和Click注解的实现,其他双击事件、ListView的条目点击事件等原理类似,大家可以以此类推
这是我第一次写博客,鉴于技术水平和经验的不足,不免有错误产生,希望大家指正错误和改进方法,谢谢!

版权声明:本文为博主原创文章,未经博主允许不得转载。

反射与IOC

反射   反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为反射机制。反射机制动态获...
  • u010926964
  • u010926964
  • 2015年08月04日 10:42
  • 3043

基于反射制作Ioc库(上)

反射 Ioc Android
  • wchicho
  • wchicho
  • 2015年07月07日 13:48
  • 386

用PHP实现简单的IoC控制反转(DI依赖注入模式)

首先编写 Fruit 的 POJO 和 Fruit 接口。继承 Fruit 接口生成两个类 Apple 和 Banana,这两个类都实现了接口的 showColor() 方法。 Fruit.ph...
  • lanyd
  • lanyd
  • 2015年12月10日 15:37
  • 1748

IOC的实现原理—反射与工厂模式

反射机制概念 我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?再考虑另一个场景,如果我们想要在运行期获得某个类的Class信息如它的属性、构造方法、一般方法...
  • fuzhongmin05
  • fuzhongmin05
  • 2017年03月12日 10:37
  • 2676

【Spring】Spring的IOC(控制反转)/DI(依赖注入)原理(一):用到“反射”编程

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 ...
  • cangchen
  • cangchen
  • 2015年04月08日 22:25
  • 1871

Spring IOC原理之Java反射机制

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

IOC概念,反射例子

http://blog.csdn.net/benjamin_whx/article/details/41791707 Ioc概念: 包括两个内容:控制&反转 对于软件来说,是某一接口具体...
  • Baple
  • Baple
  • 2015年03月17日 14:02
  • 1410

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

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

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

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

反射 实现工厂模式 和 spring IOC 实现原理

下面的程序是从魔乐科技java教程里面抄来的,感觉这几段程序说明了一些问题,所以就抄过来了。 下面是一个简单的工厂模式  [java] view plaincopy ...
  • JackieLiuLixi
  • JackieLiuLixi
  • 2014年09月11日 09:41
  • 1648
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于反射制作Ioc库(下)
举报原因:
原因补充:

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