2014-04-21 79 views
0

是否有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 Main-> City-> House。

我需要能夠提取

  • 類名
  • 方法名
  • 屬性名稱

我需要它的NetBeans插件我創建。這是否存在,免費使用/下載?

編輯:如果有一些東西從一個和一個源文件中提取類名稱,屬性名稱和方法名稱,這是一個很好的第二選項。我可以從那裏寫出額外的邏輯。

+0

http://stackoverflow.com/questions/14730706/generating-uml-diagrams-using-netbeans-7-2 – assylias

+0

對不起,有點不清楚。我需要名稱來進行編程,而不僅僅是爲了獲得它們。我需要它們在運行時返回到我的程序中。 – Einar

回答

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 

這應該是你所追求的。