使用JavaParser获取继承方法字段时遇IllegalStateException问题
JavaParser resolve()抛出IllegalStateException: No data of this type found
这个问题我之前也碰到过,核心原因是:JavaParser的resolve()方法(用来获取类的继承字段、方法等类型信息)必须依赖Symbol Solver组件才能工作,而默认情况下JavaParser并没有自动配置这个组件,导致调用resolve()时无法找到所需的类型数据,从而抛出这个异常。
解决方案步骤:
1. 先添加Symbol Solver的依赖
如果你用Maven,在pom.xml中添加:
<dependency> <groupId>com.github.javaparser</groupId> <artifactId>javaparser-symbol-solver-core</artifactId> <version>3.25.8</version> <!-- 建议使用和你当前JavaParser一致的版本 --> </dependency>
如果是Gradle,添加到build.gradle:
implementation 'com.github.javaparser:javaparser-symbol-solver-core:3.25.8'
2. 初始化Symbol Solver并关联到JavaParser实例
在解析Java文件之前,需要创建一个Symbol Solver实例,告诉它去哪里查找类的依赖(比如项目源码路径、JDK路径等),然后把它绑定到JavaParser上。
3. 修改你的代码,确保先配置好Solver再遍历类
下面是完整的修正后代码示例:
import com.github.javaparser.StaticJavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import com.github.javaparser.symbolsolver.JavaSymbolSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; import java.io.File; import java.io.IOException; public class Heritage_Attributs { private static int nmbre_attribus = 0; private static int Nmbre_attributs_déclarées = 0; private static int nmbre_methds = 0; private static int Nmbre_methodes_déclarées = 0; public static void main(String[] args) throws IOException { // 1. 创建类型解析器组合:包含项目源码路径和JDK反射类型解析 CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); // 添加你的项目源码根目录(替换成实际路径) combinedTypeSolver.add(new JavaParserTypeSolver(new File("src/main/java"))); // 添加JDK的类型支持(用于解析JDK自带的类) combinedTypeSolver.add(new ReflectionTypeSolver()); // 2. 初始化JavaSymbolSolver并绑定到StaticJavaParser JavaSymbolSolver symbolSolver = new JavaSymbolSolver(combinedTypeSolver); StaticJavaParser.getConfiguration().setSymbolResolver(symbolSolver); // 3. 解析Java文件 CompilationUnit cu = StaticJavaParser.parse(new File("你的Java文件路径.java")); // 4. 遍历类并统计字段和方法 cu.accept(new VoidVisitorAdapter<Void>() { @Override public void visit(ClassOrInterfaceDeclaration cid, Void arg) { super.visit(cid, arg); // 现在可以安全调用resolve()了 cid.resolve().getAllFields().forEach(af -> nmbre_attribus++); cid.resolve().getDeclaredFields().forEach(df -> Nmbre_attributs_déclarées++); cid.resolve().getAllMethods().forEach(am -> nmbre_methds++); cid.resolve().getDeclaredMethods().forEach(dm -> Nmbre_methodes_déclarées++); } }, null); // 输出统计结果 System.out.println("继承的字段数: " + nmbre_attribus); System.out.println("声明的字段数: " + Nmbre_attributs_déclarées); System.out.println("继承的方法数: " + nmbre_methds); System.out.println("声明的方法数: " + Nmbre_methodes_déclarées); } }
关键说明:
CombinedTypeSolver可以组合多个类型解析器,比如JavaParserTypeSolver负责解析你项目中的自定义类,ReflectionTypeSolver负责解析JDK中的类。- 必须确保在解析文件之前就配置好
SymbolResolver,否则resolve()方法还是会报错。 - 替换代码中的文件路径为你实际的项目源码路径和目标Java文件路径。
内容的提问来源于stack exchange,提问作者omar habibi
相关产品推荐
相关产品推荐

