首页 > 解决方案 > 如何使用 JavaSymbolSolver 获取变量的真实类型

问题描述

代码在这里,

class Bar {
    private int a;
    void aMethod() {
        while (true) {
            String a = "0";
            a = a + "1";
        }
    }
}

我想得到真正的a。我尝试使用下面的代码,

public class GetTypeOfReference {
     private static final String FILE_PATH = "src\\com\\test\\Bar.java";

     public static void main(String[] args) throws FileNotFoundException {
         TypeSolver typeSolver = new CombinedTypeSolver();

         JavaSymbolSolver symbolSolver = new JavaSymbolSolver(typeSolver);
         StaticJavaParser.getConfiguration().setSymbolResolver(symbolSolver);

         CompilationUnit cu = StaticJavaParser.parse(new File(FILE_PATH));

         cu.findAll(AssignExpr.class).forEach(ae -> {
             ResolvedType resolvedType = ae.calculateResolvedType();
             System.out.println(ae.toString() + " is a: " + resolvedType.describe());
         });

      }
}


但是在 com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convertToUsage(JavaParserFacade.java: 509)在 com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convert(JavaParserFacade.java:567) 在 com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserSymbolDeclaration.getType(JavaParserSymbolDeclaration.java:146) 在 com.github .javaparser.symbolsolver.model.resolution.Value.from(Value.java:40) 在 java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) 在 java.base/java.util .stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) 在 java.base/java.util.LinkedList$LLSpliterator。tryAdvance(LinkedList.java:1253) 在 java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127) 在 java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)在 java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488) 在 java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) 在 java.base/java.util .stream.FindOps$FindOp.evaluateSequential(FindOps.java:152) 在 java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 在 java.base/java.util.stream.ReferencePipeline.findFirst (ReferencePipeline.java:476) 在 com.github.javaparser.symbolsolver.javaparsermodel.contexts.AbstractJavaParserContext.solveWithAsValue(AbstractJavaParserContext.java:149) 在 com.github.javaparser.symbolsolver。javaparsermodel.contexts.StatementContext.solveSymbolAsValue(StatementContext.java:135) at com.github.javaparser.symbolsolver.resolution.SymbolSolver.solveSymbolAsValue(SymbolSolver.java:68) at com.github.javaparser.symbolsolver.resolution.SymbolSolver.solveSymbolAsValue( SymbolSolver.java:73) 在 com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:277) 在 com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:44) 在 com .github.javaparser.ast.expr.NameExpr.accept(NameExpr.java:79) 在 com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:98) 在 com.github.javaparser.symbolsolver.javaparsermodel .TypeExtractor.visit(TypeExtractor.java:44) 在 com.github.javaparser.ast.expr.AssignExpr.accept(AssignExpr.java:135) com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getTypeConcrete(JavaParserFacade.java:448) 在 com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:310) 在 com.github.javaparser .symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:292) 在 com.github.javaparser.symbolsolver.JavaSymbolSolver.calculateType(JavaSymbolSolver.java:250) 在 com.github.javaparser.ast.expr.Expression.calculateResolvedType(Expression .java:564) 在 test.GetTypeOfReference.lambda$0(GetTypeOfReference.java:32) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1378) 在 test.GetTypeOfReference.main(GetTypeOfReference.java:31 )github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:310) 在 com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:292) 在 com.github.javaparser.symbolsolver.JavaSymbolSolver。 com.github.javaparser.ast.expr.Expression.calculateResolvedType(Expression.java:564) 上的calculateType(JavaSymbolSolver.java:250) 在 java.base/java 上的 test.GetTypeOfReference.lambda$0(GetTypeOfReference.java:32)。 util.ArrayList.forEach(ArrayList.java:1378) 在 test.GetTypeOfReference.main(GetTypeOfReference.java:31)github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:310) 在 com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:292) 在 com.github.javaparser.symbolsolver.JavaSymbolSolver。 com.github.javaparser.ast.expr.Expression.calculateResolvedType(Expression.java:564) 上的calculateType(JavaSymbolSolver.java:250) 在 java.base/java 上的 test.GetTypeOfReference.lambda$0(GetTypeOfReference.java:32)。 util.ArrayList.forEach(ArrayList.java:1378) 在 test.GetTypeOfReference.main(GetTypeOfReference.java:31)JavaSymbolSolver.calculateType(JavaSymbolSolver.java:250) at com.github.javaparser.ast.expr.Expression.calculateResolvedType(Expression.java:564) at test.GetTypeOfReference.lambda$0(GetTypeOfReference.java:32) at java.base/ java.util.ArrayList.forEach(ArrayList.java:1378) 在 test.GetTypeOfReference.main(GetTypeOfReference.java:31)JavaSymbolSolver.calculateType(JavaSymbolSolver.java:250) at com.github.javaparser.ast.expr.Expression.calculateResolvedType(Expression.java:564) at test.GetTypeOfReference.lambda$0(GetTypeOfReference.java:32) at java.base/ java.util.ArrayList.forEach(ArrayList.java:1378) 在 test.GetTypeOfReference.main(GetTypeOfReference.java:31)

这样做的正确方法是什么?

标签: javasymbolsolver

解决方案


答案很晚,但对于那些感兴趣的人来说,这是正确的方法。使用 javaparser 3.16.1 结果是

a = a + "1" is a: java.lang.String

推荐阅读