解決java註解處理器生成的方法,在編譯時報錯“找不到符號”

我的註解處理器,添加的其中一個方法中有一段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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章