苍穹外卖debug篇,在使用反射机制访问类
分享于 点击 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异常。
- spring boot - Compilation error after upgrading to JDK 21 - "NoSuchFieldError: JCImport does not have member field JCTree qualid" - Stack Overflow
用户点评