用于Netbeans的Java解析器



有没有一个用于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插件。这是否存在,免费使用/下载?

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

我创建了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 

这应该是你想要的。

相关内容

  • 没有找到相关文章

最新更新