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

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图
主要关注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 等等,他们的首个版本都是运行时注解,后续版本都统一替换成了编译期注解 。
- 港澳通行证网上签注 教你微信申请港澳通行证签注
- 汽车机油常识 手教你如何选择汽车机
- 智能电视机顶盒 教你电视盒子该如何安装
- 不用酸奶机做酸奶 教你自己在家做酸奶
- 画眼妆的步骤 手把手教你画经典又好看的眼妆
- 自制葡萄酒的方法 教你最正确的自制葡萄酒方法
- 教你怎么扎头发
- 实现脱贫的根本之策是什么扶贫
- 人的自我实现结果比过程重要
- 如何清理钢化玻璃膜上的油 教你清理钢化玻璃膜上的油
