2. 添加注解
@SupportedAnnotationTypes
指定此注解处理器支持的注解,可用 *
指定所有注解 @SupportedSourceVersion
指定支持的java的版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4FmqItFB-1630840796348)(https://user-gold-cdn.xitu.io/2019/1/21/1687069b6ea67f89?imageView2/0/w/1280/h/960/ignore-error/1)]
3. 获取 AST
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TiX7c8Uh-1630840796350)(https://user-gold-cdn.xitu.io/2019/1/21/1687069c28327e45?imageView2/0/w/1280/h/960/ignore-error/1)]
在注解处理器的 init 函数里,通过 Trees.instance(env)
拿到抽象语法树(AST)。 此处把ProcessingEnvironment
强转成JavacProcessingEnvironment
,后面的操作都变成了IDE编辑器内部的操作了。
4. 操作 AST
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-souWiY3i-1630840796351)(https://user-gold-cdn.xitu.io/2019/1/21/1687069c426fb365?imageView2/0/w/1280/h/960/ignore-error/1)]
在注解处理器的 process 函数中,我们扫描所有的类,实现一个自定义的 TreeTranslator。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zJ5vFTG4-1630840796353)(https://user-gold-cdn.xitu.io/2019/1/21/1687069c4a279c25?imageView2/0/w/1280/h/960/ignore-error/1)]
为什么自定义的 TreeTranslator 要复写 visitBlock?因为我们的需求场景是扫描所有 log 语句,粒度为语句块。AST 支持我们以不同的粒度去访问,还有哪些粒度呢?我们看下TreeTranslator 的继承层次,可以发现一个 Visitor 类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OU7PDll1-1630840796355)(https://user-gold-cdn.xitu.io/2019/1/21/1687069c4bd828ad?imageView2/0/w/1280/h/960/ignore-error/1)]
打开 Visitor 类: