Javaparser - 如果条件发生,如何读取方法

Javaparser - How to read a method if a condition occurs

我正在使用 JavaParser 库,我想知道如何执行此操作:我想解析一个方法,如果有 RestTemplate 调用,我想获取“url”值。这是我的方法:

    public void myMethod() {
        try {
            String url = "http://www.google.com";
            ResponseEntity<String> response = restTemplate
                    .exchange(url, HttpMethod.GET, HttpEntity.EMPTY, String.class);
                    
        } catch (Exception exception) {
            //Error
        }
    }

所以我想提取“url”的值,但前提是我之前找到了 restTemplate 调用。换句话说,它也为我服务,我需要 restTemplate 调用的“url”值。

我现在做的是:

我假设 Url 变量有一个常量值,例如:url = "google.com"。所以我想读取一个包含“交换”字样的 MethodCallExpr,然后我想读取方法的第一个参数(在本例中,参数是“url”)所以我需要“向后”读取 url 的值,在本例中为“google.com”。我现在正在做的是:设置一个包含所有 class 个 VariableDeclarators 的 ArrayList。然后读取包含 RestTemplate 的 MethodCallExpr。最后,提取方法的第一个参数以从 ArrayList 中获取值。这是工作,但不是很花哨。

但我想知道是否有一种方法可以“向后”读取并删除包含所有 class VariableDeclarations 的 ArrayList。

使用你自己的Visitor(继承自VoidVisitorAdapter facility class)你可以重新定义访问方法public void visit(final MethodCallExpr n, final A arg) 然后尝试解析范围这个表达式(如果它存在)。这还涉及使用 JarTypeSolver 为项目的每个库配置符号求解器,可能还有 ReflexionTypeSolver 和 JavaParserTypeSolver(用于您的源文件)。下面是配置示例

ParserConfiguration config = new ParserConfiguration();
CombinedTypeSolver cts = new CombinedTypeSolver(new ReflectionTypeSolver(false),new JavaParserTypeSolver(rootSourceDir.toFile()));
// for each library dependency 
cts.add(new JarTypeSolver(<path to the jar file>));
config.setSymbolResolver(new JavaSymbolSolver(cts));
StaticJavaParser.setConfiguration(config);

“但我想知道是否有一种方法可以“向后”读取并删除包含所有 class VariableDeclarations 的 ArrayList。”

无需倒读。获得参数后,您可以使用符号求解器解析它以获得声明。在这个阶段,如果你想分析 AST,你可以在声明中使用 getWrapped 方法。下面是一个简单的例子

CompilationUnit cu = StaticJavaParser.parse(code);
List<MethodCallExpr> methodCallExpr = cu.findAll(MethodCallExpr.class);
for (MethodCallExpr expr : methodCallExpr) {
    Expression arg = expr.getArgument(0);
    // test if it's a NameExpr
    ResolvedValueDeclaration vd = arg.asNameExpr().resolve();
    if (vd.isField()) {
        FieldDeclaration vde = ((JavaParserFieldDeclaration)vd).getWrappedNode();
        System.out.println(vde.getVariable(0).getInitializer().get());
    }
}