Как правильно анализировать переменные с помощью JavaParser?
Используя JavaParser, я могу получить список моих методов и полей, используя:
//List of all methods
System.out.println("Methods: " + this.toString());
List<TypeDeclaration> types = n.getTypes();
for (TypeDeclaration type : types)
{
List<BodyDeclaration> members = type.getMembers();
for (BodyDeclaration member : members)
{
if (member instanceof MethodDeclaration)
{
MethodDeclaration method = (MethodDeclaration) member;
System.out.println("Methods: " + method.getName());
}
}
}
//List all field variables.
System.out.println("Field Variables: " + this.toString());
List<TypeDeclaration> f_vars = n.getTypes();
for (TypeDeclaration type : f_vars)
{
List<BodyDeclaration> members = type.getMembers();
for (BodyDeclaration member : members)
{
if (member instanceof FieldDeclaration)
{
FieldDeclaration myType = (FieldDeclaration) member;
List <VariableDeclarator> myFields = myType.getVariables();
System.out.println("Fields: " + myType.getType() + ":" + myFields.toString());
}
}
}
Но я не могу понять, как получить список моих переменных. Я просто хочу список всех переменных из источника Java, независимо от области видимости.
3 ответа
Решением было создать класс посетителя, который расширяет VoidVisitorAdapter и переопределяет метод visit(). Код следует:
@Override
public void visit(VariableDeclarationExpr n, Object arg)
{
List <VariableDeclarator> myVars = n.getVars();
for (VariableDeclarator vars: myVars){
System.out.println("Variable Name: "+vars.getId().getName());
}
}
Обратите внимание, что в зависимости от вашего решения исходный список полей можно выполнить с помощью следующего кода:
@Override
public void visit(FieldDeclaration n, Object arg) {
System.out.println(n);
super.visit(n, arg);
}
Не забудьте вызвать super.visit, если вы переопределяете несколько методов посещения в адаптере посетителя.
За работой:
в visit(FieldDeclaration n, Object arg)
метод VoidVisitorAdapter
класс, следующие могут быть использованы для извлечения переменных.
Он даст точное имя переменных, независимо от того, инициализированы они или нет.
String newstr;
List<VariableDeclarator> list = n.getVariables();
//as getVariables() returns a list we need to implement that way
for (VariableDeclarator var : list) {
String item = var.toString();
if (item.contains("=")) {
if (item != null && item.length() > 0) {
int index = item.lastIndexOf("=");
newstr = item.substring(0, index);
newstr = newstr.trim();
variablename = newstr;`
//variablename is the name of the desired variable.
}
}
}