使用Eclipse JDT来解析java文件

时间:2012-06-11 00:58:24

标签: java abstract-syntax-tree eclipse-jdt

我使用Eclipse JDT库来解析java源代码,以访问类中定义的所有方法。当代码在方法体中包含类似“// xxxx”的注释时,解析器将在注释之前停止,并且方法main(String [] args)被忽略。

这是解析的示例:

public class HelloWorld {

    private String name;
    private int age; 

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
                //Set the age
        this.age = age;
        System.out.println();
    }

    public static void main(String[] args) {

        HelloWorld hw = new HelloWorld();
        if(true) {
            hw.setAge(10);
        }

    }
}

这是我编写的用于解析上述示例案例的代码:

public class Parser {

/**
 * Parse java program in given file path
 * @param filePath
 */
public void parseFile(String filePath) {
    System.out.println("Starting to parse " + filePath);
    char[] source = readCharFromFile(filePath);
    ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(source);
    parser.setResolveBindings(true);
    CompilationUnit cu = (CompilationUnit) parser.createAST(null);

    cu.accept(new ASTVisitor() {

        @Override
        public boolean visit(MethodDeclaration node) {
            return true;
        }

        @Override
        public void endVisit(MethodDeclaration node) {
            System.out.println("Method " + node.getName().getFullyQualifiedName() + " is visited");
        }

    });
}
}

当我使用它来解析代码时,它只能获得getName()setName()getAge()getAge()方法访问的结果{{1被忽略了。

期待您的回答。感谢。

2 个答案:

答案 0 :(得分:1)

问题是您的readCharFromFile(filePath)方法会从文件中删除\n或行尾字符。这意味着评论后的所有行实际上都是评论的一部分。

答案 1 :(得分:1)

您使用的代码似乎存在问题。

请尝试以下代码阅读文件:

File javaFile = new File(filePath);
BufferedReader in = new BufferedReader(new FileReader(javaFile));
final StringBuffer buffer = new StringBuffer();
String line = null;
while (null != (line = in.readLine())) {
     buffer.append(line).append("\n");
}

并使用它来设置解析器源:

parser.setSource(buffer.toString().toCharArray());

其他所有代码似乎都没问题。