Java 注解开发实现(JSR-269, Java 6 开始支持)(ASM、AGP、Android Transform)

76 阅读1分钟

Java6 开始纳入了JSR-269规范:Pluggable Annotation Processing API(插件式注解处理器)。JSR-269提供一套标准API来处理Annotations,具体来说,我们只需要继承AbstractProcessor类,重写process方法实现自己的注解处理逻辑,并且在META-INF/services目录下创建javax.annotation.processing.Processor文件注册自己实现的Annotation Processor,在javac编译过程中编译器便会调用我们实现的Annotation Processor,从而使得我们有机会对java编译过程中生产的抽象语法树(AST)进行修改。

详细解释和实践例子如下文章介绍:

<https://blog.csdn.net/weixin_43983762/article/details/105867398>
<https://juejin.cn/post/6960544470635347999>

ASM 与这里 JSR-269 提供的 APT 能力的最大区别是:ASM 一般是在运行时使用,最常见的例子是进行功能增强,创建代理类。而 JSR-269 提供的 APT 能力是在编译时进行注解处理的,通过 javac 提供的工具类 AbstractProcessor 通过修改抽象语法树 AST 在编译时进行注解的处理。

但是 ASM 不止是可以实现动态代理,在 Android 中还可以实现“编译时插桩” 、“热修复” 等。

这里“编译时插桩”在 Android 中的应用,是通过 AGP( Android Gradle Plugin)提供的 Transform API在把 .class 文件转为 .dex 文件的 Transform 阶段中,通过注册的链式自定义 Transform 来实现编译时插桩操作。使用场景,例如,在所有方法前后插入方法,统计方法执行时间,然后找到耗时较大的方法进行优化,进行app的冷热启动优化操作。