【问题标题】:How to get class level variable names using javaparser?如何使用 javaparser 获取类级变量名?
【发布时间】:2018-06-04 12:07:31
【问题描述】:

我能够使用以下代码获取类级别变量的声明。但我只需要变量名。这是我为以下代码得到的输出 - [private boolean flag = true;]

import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import java.io.FileInputStream;

public class CuPrinter{
    public static void main(String[] args) throws Exception {
        // creates an input stream for the file to be parsed
        FileInputStream in = new FileInputStream("C:\\Users\\arosh\\IdeaProjects\\Bot_Twitter\\src\\MyBot.java");

        CompilationUnit cu;
        try {
            // parse the file
            cu = JavaParser.parse(in);
        } finally {
            in.close();
        }
        cu.accept(new ClassVisitor(), null);
}
private static class ClassVisitor extends VoidVisitorAdapter<Void> {
    @Override
    public void visit(ClassOrInterfaceDeclaration n, Void arg) {
        /* here you can access the attributes of the method.
         this method will be called for all methods in this
         CompilationUnit, including inner class methods */
        System.out.println(n.getFields());
        super.visit(n, arg);
    }
  }
}

【问题讨论】:

  • 您可能可以遍历n.getFields() 并检索名称
  • 没有。我想解析许多 java 文件并找到它们的类级变量。所以我不知道迭代时的变量名、修饰符、类型是什么。我想要一种获取类级别变量的通用方法。
  • 如前所述,n.getFields() 将返回一个自定义对象数组,甚至是一个全新的对象。然后可以对其进行一般迭代
  • n.getFields() 可以类似于 [private boolean flag = true;] 或 [private boolean flag;] 或 [boolean flag = true;]。所以在这种情况下,在编码时我怎么知道数组的哪个元素将是变量名。例如,第一个是第三个元素,第二个是第二个元素。
  • n.getFields() 的类类型是什么?

标签: java javaparser


【解决方案1】:

你可以试试这个。如果 FieldDeclarations 中有多个变量,请在里面多使用一个 for 循环。

public void visit(ClassOrInterfaceDeclaration n, Void arg) {

    super.visit(n, arg);
    for(FieldDeclaration ff:n.getFields())
    {
        System.out.println(ff.getVariable(0).getName());
    }
} 

【讨论】:

    【解决方案2】:

    您可以使用以下简单的正则表达式:

    final String regex = "^((private|public|protected)?\\s+)?.*\\s+(\\w+);$";
    

    然后可以编译成Pattern

    final Pattern pattern = Pattern.compile(regex);
    

    然后最后用在for-loop

    for(final String field : n.getFields()){
        // create a regex-matcher
        final Matcher matcher = pattern.matcher(field);
    
        // if field matches regex
        if(matcher.matches()){
            // get the last group -> the fieldName
            final String name = matcher.group(matcher.groupCount());
            System.out.println("FieldName: " + name);
        }
    }
    

    【讨论】:

    • @AroshaMudalige 不客气。请注意,这仅适用于声明如下的单个字段:private MyClass someName;。但不适用于多个字段声明,例如:private int x,y;。也不考虑final
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多