Netbeans的Java解析器?

时间:2014-04-21 10:50:23

标签: java parsing netbeans netbeans-plugins

是否有Netbeans的插件或解析器可以使用我的Java源代码创建树结构(或者让我轻松提取类名,属性和方法等内容)?

编辑:我需要这些名称用于编程,而不仅仅是为了获取它们。我需要它们在运行时返回我的程序。

如果我有这个源代码(对于游戏):

class Main {
    Terrain terrain;
    TradingSystem currentSystem;
    City city;

    public static void main(String[] args) {

    }
}

class Terrain {

}

class City {
    House tavern;
}

class TradingSystem {
    Bank cityBank;
    Trader npc1;
}

然后我需要一个解析器,而不是像这样创建

   ----------Main-------------------
   |          |                    |
Terrain      City          --TradingSystem---
              |            |                |
            House         Bank            Trader

来自我的源代码。我需要一条从Main到分支的路径,例如Main-> TradingSystem-> Bank,或者这个Main-> City-> House。

我需要能够提取

  • 班级名称
  • 方法名称
  • 属性名称

我需要它用于我正在创建的Netbeans插件。这是否存在,可以免费使用/下载?

编辑:如果存在从一个和一个源文件中提取类名,属性名和方法名的东西,这是一个很好的第二个选项。我可以从那里写出额外的逻辑。

1 个答案:

答案 0 :(得分:0)

我创建了3个简单的类:

public class A {
    B b;
}

public class B {
    C c;

    public C getC() {
        return c;
    }
}

public class C {

}

另一个有点复杂:

public class SO {

    A a;
    B b;
    C c;

    public static void fooMethod1() {
    }

    public String fooMethod2() {
        return "";
    }

    private double fooMethod3() {
        return 0.0;
    }
}

我能够通过这个递归代码提取上面的信息:

public void getData(Map<String, Set<String>> fields, Map<String, Set<String>> methods, Class clazz)
    {        
        if(clazz.isPrimitive())
        {
            return;
        }
        for(Method method : clazz.getDeclaredMethods())
        {
            if(!methods.containsKey(clazz.getName()))
            {
                Set<String> methodNames = new HashSet<>();
                methodNames.add(method.getName());
                methods.put(clazz.getName(), methodNames);
            }
            else
            {
                methods.get(clazz.getName()).add(method.getName());
            }
        }

        for(Field field : clazz.getDeclaredFields())
        {
            if(!fields.containsKey(clazz.getName()))
            {
                Set<String> fieldNames = new HashSet<>();
                fieldNames.add(field.getName());
                fields.put(clazz.getName(), fieldNames);
            }
            else
            {
                fields.get(clazz.getName()).add(field.getName());
            }

            getData(fields, methods, field.getType());
        }
    }

I called the code above like so:
SO so = new SO();
        Map<String, Set<String>> methods = new HashMap<>();
        Map<String, Set<String>> fields = new HashMap<>();
        so.getData(fields, methods, SO.class);

打印结果如下:

for(String str : fields.keySet())
        {
            System.out.println(str);
            for(String fieldName : fields.get(str))
            {
                System.out.print(fieldName + " ");
            }
            System.out.println();
        }

        System.out.println("-------------------------------");
        for(String str : methods.keySet())
        {
            System.out.println(str);
            for(String methodName : methods.get(str))
            {
                System.out.print(methodName + " ");
            }
            System.out.println();
        }

结果如此:

so.B
c 
so.SO
b c a 
so.A
b 
-------------------------------
so.B
getC 
so.SO
fooMethod3 getData fooMethod1 fooMethod2 main 

你应该追求的是什么。