buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

解决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

 

posted on 2023-04-03 16:53  buguge  阅读(453)  评论(0编辑  收藏  举报