You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:36:35