2

我使用 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");
        }

    });
}
}

当我用它来解析代码时,它只能得到method getName(), setName(), getAge()andgetAge()已经被访问过而main()被忽略的结果。

期待您的回答。谢谢。

4

2 回答 2

1

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

于 2012-06-13T08:25:04.263 回答
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());

代码的其他一切似乎都很好。

于 2012-06-15T06:24:55.793 回答