2011-06-21 16 views
1

を使用して静的クラスの最終フィールドの値を取得します。私は、「名前」と「photoUri」フィールドの値を読みたいとき今は、私は次のクラス構造を有する反射

 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); 
      } 
     } 

を、それは私に「オブジェクトを提供しますクラス "のインスタンスではありません。され、次のコード:

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ポインタ例外を提供します。

「name」と「photoUri」のフィールドの値はどうすればわかりますか教えてください。

+0

明確にするために、外部クラス 'TestClass'のコードを追加してください。 –

答えて

0

静的ネストされたクラスは、トップレベルではないことを除いて実際のクラスです。このクラスのメンバー変数を調べようとしているので、実際にはそのクラスのインスタンス化されたオブジェクトが必要です。

2

フィールドが静的ではないため、field.get()を呼び出すときにインスタンスを指定する必要があります。このようにそれを呼び出す

は、作業を行います。

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

彼はおそらく 'field.setAccessible(true)'も呼び出す必要があります –

+0

そうは思わない、フィールドはpublic宣言されています。 – wjans

+0

ああ...良い点。私はそれを見ませんでした。 –

0

field.get(cls)は実際にclsからfieldの値を抽出しようとしていますが、中に宣言されたすべてのフィールドを反復処理しているのでMyStaticClass、ないClassを(field属しますMyStaticClass)。この式はIllegalArgumentExceptionです。

field.get(o)を使用してください。oは、MyStaticClassのインスタンスまたはそのサブクラスです。

関連する問題