butterknife依赖注入框架源码解析

111 阅读1分钟

使用butterknife

  1. 加入注解库
  2. 标注对象或事件
  3. 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。

通过反射获取运行时注解方法的流程

  1. 获取Class对象
  2. 获取域对象
  3. 根据域对象获得注解
  4. 调用注解内方法
  • 反射缺点: 不断产生临时变量,造成UI卡顿。