Bleoo

志同道合,一杯酒。

  • 主页
  • 随笔
  • Android

Bleoo

志同道合,一杯酒。

  • 主页
  • 随笔
  • Android

Butterknife的实现探究

2017-10-11

思路

  1. 分3个模块:API、注解、编译
  2. API模块是android模块,注解和编译模块是java模块
  3. 利用注解在编译期生成代码
  4. 通过API模块调用对应的编译代码(利用反射)

注解模块

1
2
3
4
5
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface BindView {
@IdRes int value();
}

注意

注解模块需要@IdRes则需要:

1
compile 'com.android.support:support-annotations:26.0.0-alpha1'
1
2
3
4
5
6
7
8
// 因为依赖 com.android.support:support-annotations 需要添加这几段话
def logger = new com.android.build.gradle.internal.LoggerWrapper(project.logger)
def sdkHandler = new com.android.build.gradle.internal.SdkHandler(project, logger)
for (File file : sdkHandler.sdkLoader.repositories) {
repositories.maven {
url = file.toURI()
}
}

编译模块

1
2
compile 'com.google.auto.service:auto-service:1.0-rc2'
compile 'com.squareup:javapoet:1.7.0' // 生成java文件的辅助工具

利用AbstractProcessor类处理注解生成java类文件。
参照源码Github

API模块

调用规则与生成规则相关。这里是写在构造方法中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void bind(@NonNull Activity activity) {
try {
String qualifiedName = activity.getClass().getName();
Class generateClass = Class.forName(qualifiedName + "_ViewBinding");
generateClass.getConstructor(activity.getClass()).newInstance(activity);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}

小结

利用注解和编译期代码生成能在工作中获取便捷

  • android

扫一扫,分享到微信

微信分享二维码
Android 5.0到Android 6.0+的so动态库的适配问题
© 2017 Bleoo
Hexo Theme Yilia by Litten