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());
}
}
我正在使用 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());
}
}