利用所学的注解和反射的知识,实现一个 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