2015-04-30 54 views
2

我遇到了一些問題。如果對象類是使用java反射的字段上的數組,則無法獲取包和類名稱

class example{ 
    Text text=new Text(); 
    int a; 
    JLabel[] label=new JLabel[3]; 
    Panel[][][] panel=new Panel[5][5][5]; 
} 

所以,我試圖反射:

Class cls=Class.forName("example"); 
Field[]f=cls.getDeclaredFields(); 
for(field : f){ 
    field.getType().getPackage(); 
    field.getType().getName(); 
} 

包的結果爲空和類似的[[[類的結果Ljava.awt.Panel

+1

你想達到與包名,這將在這種情況下javax.swing中的什麼? – swinkler

+0

使我的代碼加載列表包名稱。 – newbie

+1

@newbie什麼是預期的結果? – Puce

回答

2

數組是一種特殊類型的。它不屬於任何包。

嘗試(未經測試):在另一方面

Class cls=Class.forName("example"); 
Field[]f=cls.getDeclaredFields(); 
for(Field field : f){ 
    Class<?> type = field.getType() 
    int numArrayDimensions= 0; 
    while (type.isArray()){ 
     type = type.getComponentType(); 
     numArrayDimensions++; 
    } 
    if (! type.isPrimitive()){ 
     Package pkg = type.getPackage(); 
    } 
    String className = getFormattedClassName(type, numArrayDimensions); 

} 

private String getFormattedClassName(Class<?> type, int numArrayDimensions){ 
     StringBuilder sb = new StringBuilder(type.getName()); 
     IntStream.range(0, numArrayDimensions).foreach(dimension -> sb.append("[]")); 
     return sb.toString(); 
} 

元是一個語言功能。代表它們的類對象不屬於任何包。

+0

這是錯誤的,如果我採取原始數據類型和多個數組。 – newbie

+0

@newbie您對原始類型有什麼期望? – Puce

+0

@newbie我已經更新了我的答案。請在您尋找擬合方法時查看Javadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html – Puce

-1

用下面的代碼嘗試獲得包名

 Package p=cls.getPackage(); 
     System.out.println(p.getName()); 

我與示例程序

 Class cls=Countcharacters.class;    
     Package p=cls.getPackage(); 
     System.out.println(p.getName()); 

嘗試,並獲得了作爲sFlow的這是我的包名

+0

OP詢問數組類型。 – Puce

+0

是的,我問陣列類型。 – newbie

1

基礎的在你的評論中,我假設你想要達到的目的是以類似的方式在類中聲明字段類型。所以,如果上課像

class Example { 
    int a; 
    int[][] f; 
    JLabel[][] label = new JLabel[3][]; 
    String s; 
} 

你想獲得

int 
int[][] 
javax.swing.JLabel[][] 
java.lang.String 

然後Field實例代表宣佈現場使用field.getType().getTypeName()

  • field.getType()將返回類代表什麼類型都可以存儲在現場,
  • ,可以很方便getTypeName()回報名閱讀形式,所以現場int[][] f;你會得到int[][]而不是[[I

演示:

class Example { 
    int a; 
    int[][] f; 
    JLabel[][] label = new JLabel[3][]; 
    String s; 
} 

class Demo { 

    public static void main(String[] ar) { 
     Class<?> cls = Example.class; 
     Field[] fields = cls.getDeclaredFields(); 
     for (Field f : fields) { 
      System.out.println(f.getType().getTypeName()); 
     } 

    } 
} 
+0

對於在Java SE 8中引入的getTypeName +1。我不知道這種方法。如果OP不需要單獨的包和名稱,那麼這是更清潔的解決方案。 – Puce

+0

但是,在註釋中提到的OP的getCanonicalName()方法提供了相同的輸出。所以目前還不清楚OP的要求。 – Puce

+0

'getCanonicalName'非常相似。現在主要區別'getTypeName'的輸出,我能發現什麼時候我們將打印非靜態內部類的類型,getCanonicalName將打印爲'Outer $ Inner',而getTypeName'作爲'Outer.Inner'打印我們用代碼編寫它。 – Pshemo

相關問題