如何从类中的每个方法获取MethodCallExpr名称和FieldAccessExpr的名称?

时间:2019-06-22 03:51:02

标签: java javaparser

我从每种方法中都有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

1 个答案:

答案 0 :(得分:0)

您快到了。我看到的唯一问题是findAll返回一个列表,并且您将此列表用作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);