注解处理器获取方法源码遇问题:方法体始终为null
问题描述
我有一个标注了自定义注解的类,想要获取该类的所有字段,并检查这些字段所属类的方法是否包含对特定服务的调用。但当前遇到的问题是,获取到的方法体始终为null。注:字段所属类位于另一个模块中。
相关代码:
public boolean process( Set<? extends TypeElement> annotations, RoundEnvironment roundEnv ) { Set<? extends Element> annotatedClasses = getAnnotatedClasses( annotations, roundEnv ); annotatedClasses.forEach(annotatedClass -> { List<? extends Element> fields = getFields( annotatedClass ); fields.forEach( field -> { List<ExecutableElement> methods = getMethods( field ); methods.forEach( method -> { MethodScanner methodScanner = new MethodScanner(); MethodTree methodTree = methodScanner.scan( method, this.trees ); BlockTree body = methodTree.getBody(); } } } }
MethodScanner基于Java注解处理器的源码访问实现。
解决方法
1. 确保跨模块源码被注解处理器访问到
注解处理器默认只能访问当前编译模块的源码文件,其他模块如果只提供编译后的.class文件,无法通过Tree API获取方法体。
- 用构建工具(Gradle/Maven)将依赖模块配置为源码级依赖:
- Gradle:依赖模块使用
implementation project(':your-dependency-module'),并添加compileJava.dependsOn(':your-dependency-module:compileJava'),让注解处理器能读取到依赖模块的.java文件。 - Maven:确保依赖的
<scope>为compile,且依赖模块的源码能被当前项目的编译上下文加载(比如通过多模块聚合)。
- Gradle:依赖模块使用
2. 校验Tree API的初始化与可用性
- 确认
this.trees是通过Trees.instance(processingEnv)正确获取的,不要自行初始化。 - 在获取MethodTree前先判断:如果
trees.getTree(method)返回null,说明该方法的源码不在当前编译上下文,此时无法通过Tree API获取方法体。
3. 字节码解析作为 fallback 方案
如果无法获取跨模块源码,直接解析字节码来检查方法调用:
用ASM、Javassist等字节码工具读取依赖模块的.class文件,遍历方法指令查找特定服务的调用。比如ASM示例片段:
ClassReader cr = new ClassReader("com.example.DependencyClass"); cr.accept(new ClassVisitor(Opcodes.ASM9) { @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodVisitor(Opcodes.ASM9, mv) { @Override public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { // 检查是否调用了目标服务的方法 if (owner.equals("com.example.TargetService") && name.equals("targetMethod")) { // 处理找到调用的逻辑 } super.visitMethodInsn(opcode, owner, name, desc, itf); } }; } }, 0);
内容的提问来源于stack exchange,提问作者kylie.zoltan
相关产品推荐
相关产品推荐

