我的註解處理器,添加的其中一個方法中有一段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裏,但並未解決我的問題。
最後的解決方案見如下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