2012-01-19 97 views
3

我正在圍繞此進行循環。從反射中獲取字段的類名稱

我有一類人,比如現在

public class Person { 
String name = ""; 
} 

,我想反思此類實例&弄清楚什麼是類名稱聲明。

因此,名稱=字符串或java.lang.String中

這是我的代碼:

'這' 是人的一個實例。

try { 
    String className = this.getClass().getName(); 
     Class cls = Class.forName(className); 
     Field fieldlist[] = cls.getDeclaredFields(); 
     for (int i = 0; i < fieldlist.length; i++) { 
      Field fld = fieldlist[i]; 
      int mod = fld.getModifiers(); 
      System.out.println("1. " + fld.toGenericString()); 
      System.out.println("2. " + fld.getName()); 
      System.out.println("3. " + fld.getGenericType() + "]"); 



      Object oj = fld.getType(); 

      // Says that 4: class java.lang.String 

      System.out.println("4: " + oj.toString()); 
      Class c1 = oj.getClass(); 

      // Should throw Exception 
      String stype = c1.getDeclaringClass().toString(); 
      System.out.println("5. " + stype); 


     } 
     } 
     catch (Throwable e) { 
     System.err.println(e); 
     } 

我設法得到了各國的一部分:

類java.lang.String

,但我需要的是 「java.lang.String中」

任何想法?

+0

它給這個在類的類的toString方法,它被寫爲像這樣的「班級你的班級名稱」 –

回答

4

嘗試..的getType(),然後的getName()

fld.getType().getName() 

編輯:(Aften天綠評論) - 請注意, fld.getType().getCanonicalName()將給予相同的輸出在大多數情況下。當使用內部類時,輸出是不同的。這裏是來自搜索的link。根據您所需要的類名做什麼,你可以選擇的getName()或另一方面,getCanonicalName()

+0

,也工作:) –

+0

感謝球員,但.getName()更可靠在我工作的情況下。 – Araejay

2
System.out.println("3. " + fld.getType().getCanonicalName()); 

結果之一:

3. java.lang.String 
0

我想我解決了它,

應該做的這樣的:

String stype = fld.getType().getName(); 
-1

我通過調用這個 f.getDec有一個字段的類名laringClass()。getSimpleName()

+0

這實際上不正確,因爲'f.getDeclaringClass()'返回已聲明字段的類的類型,而不是字段類型本身。 'f.getType()'是正確的答案。 – JDelorean

相關問題