基于反射制作Ioc库(下)
2015-07-07 14:27
197 查看
介绍
在上一节我们已经完成了对ViewById注解的实现,从中我们可以发现先去获取Class声明的所有属性,然后遍历出带有我们预定义的注解的属性,我们自己在Activity子类声明的属性和Android Sdk自带Activity的属性其数量可想而知,这也是基于反射Ioc效率比较低下的原因,只有知道效率低的原因才可以对其改进,我们会在以后的文章中持续对其改进。在这里我们继续完成对Click注解的实现
核心方法编写
获取Class的所有方法
遍历方法列表,找出带有Click注解的方法
由于我们仅仅是为了说明原理,其中viewTarget.setTag(R.id.base_ioc_method_id, method);方法是通过唯一的id传递我们的方法Method,Andbase中支持点击事件类型比较多,是通过动态代理的方式实现。下面是iocListener部分
在onClick方法具体实现中,首先判断我们在Activity中声明的方法
在这里我们并不需要TextView实例,但是有时候我们需要TextView的实例从而更新它的UI表现
所以在onClick中我们首先判断该Method的参数列表信息,如果需要View是实例我们就调用
method.invoke(this, v) 否则就调用method.invoke(this, new Object);
- 小结
到这里我们就完成了ViewById和Click注解的实现,其他双击事件、ListView的条目点击事件等原理类似,大家可以以此类推
这是我第一次写博客,鉴于技术水平和经验的不足,不免有错误产生,希望大家指正错误和改进方法,谢谢!
在上一节我们已经完成了对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的条目点击事件等原理类似,大家可以以此类推
这是我第一次写博客,鉴于技术水平和经验的不足,不免有错误产生,希望大家指正错误和改进方法,谢谢!
相关文章推荐
- 开始写博客啦!
- Maven指定文件上传远程仓库【非中央仓库】
- windows curl ssl版本编译
- java.sql.SQLException: 关闭的连接 解决办法
- EasyDarwin开源平台直播架构
- Powerful Regex
- Spring MVC接收参数的方式
- galera安装之编译安装xtrabackup 2.2.11
- jq仿京东图片放大效果
- Docker 容器真的安全么?
- FreeSWITCH 中的lua脚本里使用cjson的办法
- iOS 瘦身ViewController 分离tableViewDataSource
- AVALON-MM接口
- 安卓开发工具资料
- 字符串拼接规则
- 编写自己的Exception
- 时间复杂度和空间复杂度
- 使用到的一些开源项目 一般根据名字都能搜出源码
- 双缓冲技术(基于GDI+实现)
- galera 源码安装