欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

苍穹外卖debug篇,在使用反射机制访问类

来源: javaer 分享于  点击 45270 次 点评:251

苍穹外卖debug篇,在使用反射机制访问类


1.编译错误

在编译初始代码时出现错误

java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field   'com.sun.tools.javac.tree.JCTree qualid'

java.lang.NoSuchFieldError是一种运行时错误,说明在运行时尝试访问一个不存在的字段。

  • 在使用反射机制访问类的字段时,字段名称拼写错误或字段不存在。
  • 项目依赖的库或模块版本不一致,导致编译时存在字段但运行时缺失。
  • 代码或依赖库发生变更后未重新编译,导致运行时与编译时的类版本不一致。

而我的这个错误是因为JDK版本和Lombok版本冲突,给的原始代码编译是jdk1.8的,但是我IDEA默认编译项目的版本是jdk23。

jdk21之后,Lombok等库无法正确访问内部的Java编译器API会引起这种错误。具体原因是:

Lombok在早期版本中使用反射访问com.sun.tools.javac.tree.JCTree$JCImport类的qualid字段,该字段在Java 21中的类型发生了变化。

在Java 21及更高版本中,qualid字段的类型从JCTree变更为JCFieldAccess。这导致了Lombok无法正确访问该字段,从而抛出NoSuchFieldError异常。

  1. spring boot - Compilation error after upgrading to JDK 21 - "NoSuchFieldError: JCImport does not have member field JCTree qualid" - Stack Overflow
相关栏目:

用户点评