Я создал небольшую программу, которая читает файл Java и передает его в ASTParser из Eclipse JDT для построения дерева абстрактного синтаксиса (AST).Корневой узел - это CompilationUnit, к которому я могу получить доступ.Затем я перебираю коллекцию Types , которая содержит класс (ы) из файла Java.В моем случае есть только один (публичный класс).Этот класс представлен как объект типа 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: 0
и Methods: 0
, когда я фактическиожидайте Fields: 2
и Methods: 6
.