使用butterknife
- 加入注解库
- 标注对象或事件
- 在
onCreate中,setContentView之后调用ButterKnife.bind完成绑定
注解
3种类型
普通注解
元注解
标注注解的注解
- @Retention用来描述注解的生命周期。@Inherited表示该注解可被继承。
例子
- @interface表明metaTest是一个自定义注解。然后利用上面的元注解对该自定义注解进行解释。
- @Documented表明该注解要被Java doc所记录。
- @Target传入的ElementType.TYPE表示该注解用来描述类或者接口。
- @Retention用来描述注解的生命周期。传入的RUNTIME表示该注解只在运行时有效。就可以通过反射获取注解内容。
butterknife的BindView注解
- 这里@Retention传入的是CLASS表示butterknife是在编译时生成绑定View的代码。不是RUNTIME不会影响运行时速度,但会影响编译时速度。
- 注意butterknife不是在运行时通过反射处理注解,是在编译时处理。
注解处理器APT(Annotation Processor)
流程
- 2中继承了AbstractProcessor类后,在编译时编译器会扫描所有需要处理的注解。
- 3中调用了
process会对注解进行处理,如createTpye()中createBindingConstructor动态绑定,将bindView转换成findViewById。
通过反射获取运行时注解方法的流程
- 获取Class对象
- 获取域对象
- 根据域对象获得注解
- 调用注解内方法
- 反射缺点: 不断产生临时变量,造成UI卡顿。