2011-06-21 141 views
1

我有下面的類結構得到一個靜態類的最後一個字段的值:使用反射

 private static class MyStaticClass { 
      public final String name; 
      public final String photoUri; 
      private MyStaticClass(String pName, String pPhotoUri) { 
       this.name = pName; 
       this.photoUri = pPhotoUri; 
      } 

      public static MyStaticClass getNewMyStaticClass(String pName) { 
       return new MyStaticClass(pName, null); 
      } 
     } 

現在,當我想讀「名」和「photoUri」字段的值,它給了我「對象不是類的一個實例「。以下是代碼:

void printValues() { 
    try { 
     Class cls = Class.forName("my.pkg.name.TestClass$MyStaticClass"); 
     for(Field field: cls.getDeclaredFields()) { 
      System.out.println("Field name: " + field.getName()); 
      System.out.println("Field value: " + field.get(cls)); 
     } 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
} 

我也嘗試在field.get(null)處傳遞「null」來讀取值,但它給出了空指針異常。

請幫幫我,我怎樣才能讀取字段「名稱」和「photoUri」的價值?

+0

爲了清楚起見,請添加外部類「TestClass」的代碼。 –

回答

0

靜態嵌套類是一個實際的類,除了它不是頂級的。既然你試圖查看這個類的成員變量,你實際上需要這個類的實例化對象來做到這一點。

2

你的字段不是靜態的,你應該在調用field.get()時指定一個實例。

調用它這樣做的工作:

field.get(new MyStaticClass("name", "photoUri")) 
+0

他很可能還需要調用'field.setAccessible(true)' –

+0

不要這麼認爲,字段是公開的。 – wjans

+0

啊...好點。我沒有看到。 –

0

表達field.get(cls)居然會嘗試從cls提取field的價值,但field屬於MyStaticClass,不Class(因爲你是通過聲明的所有領域的迭代MyStaticClass)。這個表達式會拋出IllegalArgumentException

使用field.get(o),其中oMyStaticClass或其子類的實例。