javasymbolsolver - 如何使用 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)
这样做的正确方法是什么?
解决方案
答案很晚,但对于那些感兴趣的人来说,这是正确的方法。使用 javaparser 3.16.1 结果是
a = a + "1" is a: java.lang.String
推荐阅读
- apache-spark - 使用编码 utf-16le 从 csv 加载数据
- python - 使用 Scrapy 输出数据时出现问题
- javascript - 使用 SAP Cloud Platform 中的 Approuter 在 MTA 应用程序中获取 Approuter URL
- javascript - 显示每个标签出现的次数
- react-native - 如何从这样的 react-navigation v5 函数中的帖子中获取 id?
- javascript - 如何使用for循环对数组中的所有数字求和?
- node.js - nvm 使用不起作用 - 什么将节点版本设置为 10?
- php - Laravel 僵尸文件_put_contents 异常
- activemq-artemis - ActiveMQ Artemis:如何审计(或计算)每个消费者收到多少数据(按字节)?
- javascript - 来自 https://github.com/thread-pond/signature-pad 的 JS 签名板无法在较大的触摸屏笔记本电脑和台式机上工作