【发布时间】: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