【问题标题】:JavaSymbolSolver: get field's fully qualified nameJavaSymbolSolver:获取字段的完全限定名
【发布时间】:2018-11-29 12:24:03
【问题描述】:

我使用 JavaParser(来自 javaparser.org)和 javasymbolsolver 来解析 Java。

我有一个访问File.separator 的简单Java 源代码(参见源代码中的多行字符串);我希望我的程序打印java.io.File.fileseparator。相反,它打印File.separator,我得到UnsolvedSymbolException{context='File', name='Solving File'};然后它打印System.out,我得到UnsolvedSymbolException{context='System', name='Solving System'}

@Test
public void parserTest() {
    CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
    combinedTypeSolver.add(new ReflectionTypeSolver());
    JavaSymbolSolver symbolSolver = new JavaSymbolSolver(combinedTypeSolver);
    JavaParser.getStaticConfiguration().setSymbolResolver(symbolSolver);

    CompilationUnit compilationUnit = JavaParser.parse(
            "import java.io.File;\n" +
            "\n" +
            "public class Main {\n" +
            "    static String s = File.separator;\n" +
            "    public static void main(String args[]) {\n" +
            "        System.out.println(s);\n" +
            "    }\n" +
            "}\n");
    compilationUnit.accept(
            new ModifierVisitor<Void>() {
                @Override
                public Visitable visit(final FieldAccessExpr n, final Void arg) {
                    System.out.println(n);
                    try { // this does not work!!!
                        System.out.println(n.getScope().calculateResolvedType());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return super.visit(n, arg);
                }
            },
            null
    );
}

据我了解,在 Java Symbol Solver 的某个深处,它试图将 File 解析为一个值,当然失败了。

如何获得字段的完全限定名?

【问题讨论】:

  • 您是否尝试在要解析的代码中使用完全限定名称?那是用java.io.File.separator 代替File.separator。而不是简单的System.out 使用java.lang.System.out。看起来 javaparser 没有按预期使用导入?!
  • @dpr UnsolvedSymbolException{context='unknown', name='io'}, UnsolvedSymbolException{context='java', name='Solving java'}。它尝试将其解析为一个值。

标签: java javaparser javasymbolsolver


【解决方案1】:

更新到 3.8.0 后,以下工作:

ResolvedType resolvedType = n.getScope().calculateResolvedType();
System.out.println(resolvedType.describe());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2014-06-04
    • 1970-01-01
    • 2016-09-30
    • 2021-11-30
    • 2011-01-02
    • 2018-08-11
    相关资源
    最近更新 更多