gpt4 book ai didi

java - 为什么我的 AST TypeDeclaration 缺少其方法和字段?

转载 作者:行者123 更新时间:2023-12-01 15:34:25 24 4
gpt4 key购买 nike

我创建了一个小程序,它读取 Java 文件并将其从 Eclipse JDT 提供给 ASTParser 以构建抽象语法树 (AST)。根节点是我可以访问的 CompilationUnit。然后,我迭代包含 Java 文件中的类的 Types 集合。就我而言,只有一个(公共(public)类)。此类表示为 TypeDeclaration 类型的对象。我知道我已经成功访问​​了这个对象,因为我能够获取它的 SimpleName 并将其打印到控制台。

TypeDeclaration有许多方法,包括getFields()getMethods()。但是,当我调用这些方法时,它们返回空集合。我正在阅读的 Java 类当然有字段和方法,所以我不明白为什么它会显示为空。任何想法是什么导致了这个?我是否以某种方式滥用了这个 API 或者我没有初始化某些东西?

这是我用于访问 AST 的代码的简化版本:

// char array to store the file in
char[] contents = null;
BufferedReader br = new BufferedReader(new FileReader(this.file));
StringBuffer sb = new StringBuffer();
String line = "";
while((line = br.readLine()) != null) {
sb.append(line);
}
contents = new char[sb.length()];
sb.getChars(0, sb.length()-1, contents, 0);

// Create the ASTParser
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(contents);
parser.setResolveBindings(true);
CompilationUnit parse = (CompilationUnit) parser.createAST(null);

// look at each of the classes in the compilation unit
for(Object type : parse.types()) {
TypeDeclaration td = (TypeDeclaration) type;
// Print out the name of the td
System.out.println(td.getName().toString()); // this works
FieldDeclaration[] fds = td.getFields();
MethodDeclaration[] mds = td.getMethods();
System.out.println("Fields: " + fds.size()); // returns 0???
System.out.println("Methods: " + mds.size()); // returns 0???
}

这是我正在读取的 Java 文件:

public class Vector {

// x, the first int value of this vector
private int x;

// y, the second int value of this vector
private int y;

public Vector(int x, int y) {
this.x = x;
this.y = y;
}

public String toString() {
return "Vector( " + this.x + " , " + this.y + " )";
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}
}

因此,正如预期的那样,我的 AST 代码中的第一次打印结果为 Vector,但随后的打印结果为 Fields: 0Methods: 0 ,当我实际上期望 Fields: 2Methods: 6 时。

最佳答案

上述代码的问题是换行符 (\n) 丢失了。每次将 BufferedReader 的内容附加到 StringBuffer (sb) 时,都不会包含 \n。结果是,从示例程序的第 3 行开始,所有内容都被注释掉,因为程序被读入为:

public class Vector { // x, the first int value of this vector private int x; ...

不用担心,因为有一个简单的解决方案。在解析程序的 while 循环内部,简单地将 \n 附加到读取的每行输入的末尾。如下:

...
while((line = br.readLine()) != null) {
sb.append(line + "\n");
}
...

现在应该可以正确读入程序,并且输出应该如预期的那样为 2 个字段和 6 个方法!

关于java - 为什么我的 AST TypeDeclaration 缺少其方法和字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9123523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com