利用所学的注解和反射的知识,实现一个 IoC 框架,简化代码。
最终的效果如下
1  | (R.layout.activity_main)  | 
什么是 IoC
IoC,就是控制反转(Inversion of Control),缩写为 IoC。
简单来说,就是不需要手动 new 对象,只需要在配置文件或者注解指定一下类名,让框架去解析配置文件或者注解,然后利用反射实例化我们配置的类。
比如,在 Android 应用开发中,我们需要手动调用 setContentView(int layoutResID)、findViewById(int id) 和 setOnClickListener(OnClickListener l) 方法,如果利用注解,只需要指定一下布局文件或者控件的资源 Id,让框架办公我们去找到空间和调用方法。比如下面的代码就是一个例子
1  | (R.layout.activity_main)  | 
实现
需要三个注解:
注解布局文件
1  | (ElementType.TYPE)  | 
注解视图
1  | (ElementType.FIELD)  | 
注解点击事件
1  | (ElementType.METHOD)  | 
有了注解,接着就需要一个注解解析类,去解析被注解的类,得到信息,然后调用相关的方法
1  | public class Views {  | 
这个注解解析类要做的事情有三件:
- 解析布局文件的注解
 - 解析视图的注解
 - 解析点击事件的注解
 
解析布局文件的注解
1  | private static void injectContentView(Activity activity) {  | 
解析视图的注解
1  | private static void injectViews(Activity activity) {  | 
解析点击事件的注解
1  | private static void injectOnClickListener(final Activity activity) {  | 
缺陷
以上的代码是有性能缺陷的,因为使用的是运行时注解,对性能有影响。如果使用编译时注解搭配APT来生成相关的代码,性能与手动写的代码没有区别。
编译时注解的具体实现看这篇文章——利用编译时注解实现一个ButterKnife