解决javac注解处理器生成的方法,在编译时报错“找不到符号”
我的注解处理器,添加的其中一个方法中有一段AST代码如下:
JCTree.JCFieldAccess objectsIsNull = maker.Select(maker.Ident(names.fromString("java.util.Objects")), names.fromString("isNull")); JCTree.JCIf ifExpr1 = maker.If( maker.Apply(List.nil(), objectsIsNull, List.of(maker.Ident(param_code))), maker.Return(maker.Literal(TypeTag.BOT, null)), null);
生成的java代码是: if (java.util.Objects.isNull(code)) return null;
IDEA在build项目时,报错↓↓↓
Error:(3, 13) java: 找不到符号
符号: 变量 java.util.Objects
位置: 类 com.example.sbootjsp.enumtest.WeekdayEnum
而我在其他地方引用的java.lang.String是不会报错的。经查,java.util.Objects在jdk\src.zip包下,而java.lang.String在jdk\jre\lib\rt.jar中。
我试图在Project Structure中将src.zip加到项目的SDK里,但并未解决我的问题。
最后的解决方案是修正对TreeMaker#Ident方法的使用,见如下AST代码变动,IDEA不报这个“找不到符号”错误了。变更前后所生成的java代码是一样的。
JCTree.JCFieldAccess objects = maker.Select(maker.Ident(names.fromString("java.util")), names.fromString("Objects")); JCTree.JCFieldAccess objectIsNull = maker.Select(objects, names.fromString("isNull")); JCTree.JCIf ifExpr1 = maker.If( maker.Apply(List.nil(), objectIsNull, List.of(maker.Ident(param_code))), maker.Return(maker.Literal(TypeTag.BOT, null)), null);
附:idea→Project Structure 配置SDK
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/17283608.html