一,核心依赖:APT(Annotaion Processing Tools)
编译时Annotation解析的基本原理是,在某些代码元素上(如类型、函数、字段等)添加注解,在编译时javac编译器会检查AbstractProcessor的子类,并且调用该类型的process函数,然后将添加了注解的所有元素都传递到process函数中,使得开发人员可以在编译器进行相应的处理,例如,根据注解生成新的Java类,这也就是ButterKnife Dragger等开源库的基本原理
二,第三方框架的应用:ButterKnife Dragger Retrofit
ButterKnife:这个库是针对View,资源ID,部分事件等进行注解的开源库,它能够去除掉一些不怎么雅观的样板式代码,使得我们的代码更加简洁,易于维护,同时给予APT也能使得它的效率得到保证。ButterKnife是针对View等进行注解的开源库
Dragger:解决Android或java中依赖注入的一个类库(DI类库)
Retrofit:通过大范围使用注解简化Http请求
三,模仿ButterKnife的@BindView功能
1,配置
(1)AndroidStudio 配置
a.项目build.gradle
repositories { mavenCentral() }
dependencies {classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'}
allprojects {repositories { mavenCentral() } }
b.主Moudule build.gradle
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
compile project(':inject')
apt project(':inject-compiler')}
(2)新建Android Library(app进行依赖) inject
(3)新建Java Library(放置注解) inject-annotion
(4)新建Java Library(注解解析,处理java文件) inject-compiler
compile project(':inject-annotion')
compile 'com.google.auto:auto-common:0.8'
compile 'com.google.auto.service:auto-service:1.0-rc3'
compile 'com.squareup:javapoet:1.8.0'(生成java文件)
2,代码编写
(1)inject
String clsName=activity.getClass().getName();
Class<?> viewBidClass=Class.forName(clsName+"$$ViewBinder");
ViewBinder viewBinder= (ViewBinder) viewBidClass.newInstance();
viewBinder.bind(activity);
(2)inject-annotion
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.CLASS)
public @interface BindView {
int value(); }
(3) inject-compiler
@AutoService(Processor.class)
public class BindViewProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) { ... ...代码省略 } }