web-dev-qa-db-ja.com

Java:変数に格納されている名前でクラスのフィールドにアクセスするにはどうすればよいですか?

名前が動的で文字列変数に格納されているクラスのフィールドを設定または取得するにはどうすればよいですか?

public class Test {

    public String a1;
    public String a2;  

    public Test(String key) {
        this.key = 'found';  <--- error
    } 

}
26
ufk

リフレクションを使用する必要があります:

  • Class.getField() を使用して Field 参照を取得します。公開されていない場合は、代わりに Class.getDeclaredField() を呼び出す必要があります
  • _AccessibleObject.setAccessible_ を使用して、フィールドがパブリックでない場合にアクセスします
  • 値を設定するには Field.set() を使用します。プリミティブの場合は、類似した名前のメソッドの1つを使用します

以下は、パブリックフィールドの単純なケースを扱う例です。可能であれば、プロパティを使用することをお勧めします。

_import Java.lang.reflect.Field;

class DataObject
{
    // I don't like public fields; this is *solely*
    // to make it easier to demonstrate
    public String foo;
}

public class Test
{
    public static void main(String[] args)
        // Declaring that a method throws Exception is
        // likewise usually a bad idea; consider the
        // various failure cases carefully
        throws Exception
    {
        Field field = DataObject.class.getField("foo");
        DataObject o = new DataObject();
        field.set(o, "new value");
        System.out.println(o.foo);
    }
}
_
39
Jon Skeet
Class<?> actualClass=actual.getClass();

Field f=actualClass.getDeclaredField("name");

上記のコードで十分です。

object.class.getField("foo");

残念ながら、クラスには空のフィールド配列があるため、上記のコードは機能しませんでした。

1
JITHIN