手把手教你实现Android编译期注解

手把手教你实现Android编译期注解,博智网带你了解详细信息 。
详细阐述了实现一个Android编译期注解sdk的步骤以及注意事项,并简要分析了运行时注解以及字节码技术在生成代码上与编译期注解的不同与优劣
一、编译期注解在开发中的重要性从早期令人惊艳的ButterKnife,到后来的以ARouter为首的各种路由框架,再到现在谷歌大力推行的Jetpack组件,越来越多的第三方框架都在使用编译期注解这门技术,可以说不管你是想要深入研究这些第三方框架的原理 还是要成为一个Android高级开发工程师,编译期注解都是你不得不好好掌握的一门基础技术 。
本文从基础的运行期注解用法开始,逐步演进到编译期注解的用法,让你真正明白编译期注解到底应该在什么场景下使用,怎么用,用了有哪些好处 。
二、手写运行期注解类似下面这种写法,当View一多得不停的findViewById 写很多行,手写起来很麻烦,我们首先尝试用运行期注解来解决这个问题,看看能不能自动处理这些findViewById的操作 。

手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
手把手教你实现Android编译期注解

文章插图
主要关注Element的这5个子类即可,举个例子:
package com.smart.annotationlib_2;//PackageElement |表示一个包程序元素//TypeElement 表示一个类或接口程序元素 。public class VivoTest {//VariableElement |表示一个字段、enum 常量、方法或构造方法参数、局部变量或异常参数 。int a;//VivoTest 这个方法 :ExecutableElement|表示某个类或接口的方法、构造方法或初始化程序(静态或实例),包括注释类型元素 。//int b 这个函数参数: TypeParameterElement |表示一般类、接口、方法或构造方法元素的形式类型参数 。public VivoTest(int b ) {this.a = b;}}
四、Javapoet生成代码有了上面的基础 再用 Javapoet 写一遍字符串拼接来生成java代码的过程,就不会难以理解了 。
private void generateCodeByJavapoet(String className, List<Element> elements) throws IOException {//声明构造方法MethodSpec.Builder constructMethodBuilder =MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).addParameter(ClassName.bestGuess(className), "activity");//构造方法里面 增加语句for (Element e : elements) {constructMethodBuilder.addStatement("activity." + e.getSimpleName() + "=activity.findViewById(" + e.getAnnotation(BindView.class).value() + ");");}//声明类TypeSpec viewBindingClass =TypeSpec.classBuilder(className + "ViewBinding").addModifiers(Modifier.PUBLIC).addMethod(constructMethodBuilder.build()).build();String packageName = elementUtils.getPackageOf(elements.get(0)).getQualifiedName().toString();JavaFile build = JavaFile.builder(packageName, viewBindingClass).build();build.writeTo(filer);}
这里要提一下,现在越来越多的人使用Kotlin语言开发app,你甚至可以使用https://github.com/square/kotlinpoet 来直接生成Kotlin代码 。有兴趣的可以尝试一下 。
五、编译期注解的总结首先是大家关注的性能方面,对于运行时注解来说,会产生大量的反射代码,而且反射调用的次数会随着项目复杂度的提高而变的越来越多,是一个逐步劣化的过程,而对于编译期注解来说,反射的调用次数是固定的,他并不会随着项目复杂度的提高而变的性能越来越差,实际上对于大多数运行时注解的项目都可以通过编译期注解来大幅提高框架的性能,比如著名的Dagger、EventBus 等等,他们的首个版本都是运行时注解,后续版本都统一替换成了编译期注解 。