如何从class中的每个方法中获取MethodCallExpr name 和FieldAccessExpr 的名称?
How to get the name of MethodCallExpr name and FieldAccessExpr from each methods in a class?
我从每个方法中得到了 MethodCallExpr 和 FieldAccessExpr。
这是我完成的一些代码。
for (TypeDeclaration<?> typeDec : cu.getTypes()) {
for (MethodDeclaration method : typeDec.getMethods()) {
method.getBody().ifPresent(field -> {
System.out.println(ml.getMethodsByClass(0,methodCol));
System.out.println("Method call : " + field.findAll(MethodCallExpr.class));
//stmtMethod = field.findAll(MethodCallExpr.class);
System.out.println("Field access : " + field.findAll(FieldAccessExpr.class));
//stmtVariables = field.findAll(FieldAccessExpr.class);
});
methodCol++;
System.out.println();
}
}
原因: 我无法获取 MethodAccessExpr 和 FieldAccessExpr 的名称。
实际输出:
methodC
ethod calls : [d1.methodA(), d1.methodB(), System.out.println(d1.text1 + "\t" + d1.text2)]
field access : [System.out, d1.text1, d1.text2]<br>
methodD
method calls : [d3.methodE(), System.out.println(d3.d3x + "\t" + d3.d3y)]
field access : [System.out, d3.d3x, d3.d3y]
预期输出:
methodC
method calls: methodA, methodB, println
field access: out, text1, text2
methodD
method calls: methodE, out
field access: out, d3x, d3y
你快到了。我看到的唯一问题是 findAll
returns 一个列表,并且您将此列表用作 System.out
的参数。您需要做的是检索列表中的每个元素以获取其名称。这是一个示例(请注意,为了保持一致性,我已将 field
重命名为 blockStatement
):
for (TypeDeclaration<?> typeDec : cu.getResult().get().getTypes()) {
for (MethodDeclaration method : typeDec.getMethods()) {
method.getBody().ifPresent(blockStatement -> {
List<FieldAccessExpr> results = blockStatement.findAll(FieldAccessExpr.class);
for( FieldAccessExpr expr : results ) {
System.out.println(expr.getName());
}
如果您只想打印所有字段(和方法)名称,更紧凑的方法是使用流:
blockStatement.findAll(FieldAccessExpr.class)
.stream()
.map(FieldAccessExpr::getName)
.forEach(System.out::println);
我从每个方法中得到了 MethodCallExpr 和 FieldAccessExpr。 这是我完成的一些代码。
for (TypeDeclaration<?> typeDec : cu.getTypes()) {
for (MethodDeclaration method : typeDec.getMethods()) {
method.getBody().ifPresent(field -> {
System.out.println(ml.getMethodsByClass(0,methodCol));
System.out.println("Method call : " + field.findAll(MethodCallExpr.class));
//stmtMethod = field.findAll(MethodCallExpr.class);
System.out.println("Field access : " + field.findAll(FieldAccessExpr.class));
//stmtVariables = field.findAll(FieldAccessExpr.class);
});
methodCol++;
System.out.println();
}
}
原因: 我无法获取 MethodAccessExpr 和 FieldAccessExpr 的名称。
实际输出:
methodC
ethod calls : [d1.methodA(), d1.methodB(), System.out.println(d1.text1 + "\t" + d1.text2)]
field access : [System.out, d1.text1, d1.text2]<br>
methodD
method calls : [d3.methodE(), System.out.println(d3.d3x + "\t" + d3.d3y)]
field access : [System.out, d3.d3x, d3.d3y]
预期输出:
methodC
method calls: methodA, methodB, println
field access: out, text1, text2
methodD
method calls: methodE, out
field access: out, d3x, d3y
你快到了。我看到的唯一问题是 findAll
returns 一个列表,并且您将此列表用作 System.out
的参数。您需要做的是检索列表中的每个元素以获取其名称。这是一个示例(请注意,为了保持一致性,我已将 field
重命名为 blockStatement
):
for (TypeDeclaration<?> typeDec : cu.getResult().get().getTypes()) {
for (MethodDeclaration method : typeDec.getMethods()) {
method.getBody().ifPresent(blockStatement -> {
List<FieldAccessExpr> results = blockStatement.findAll(FieldAccessExpr.class);
for( FieldAccessExpr expr : results ) {
System.out.println(expr.getName());
}
如果您只想打印所有字段(和方法)名称,更紧凑的方法是使用流:
blockStatement.findAll(FieldAccessExpr.class)
.stream()
.map(FieldAccessExpr::getName)
.forEach(System.out::println);