33

How can I set or get a field in a class whose name is dynamic and stored in a string variable?

public class Test {

    public String a1;
    public String a2;  

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

}
Boann
  • 48,794
  • 16
  • 117
  • 146
ufk
  • 30,912
  • 70
  • 235
  • 386

2 Answers2

51

You have to use reflection:

Here's an example which deals with the simple case of a public field. A nicer alternative would be to use properties, if possible.

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);
    }
}
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • set() asks me for two parameters, Object and value, why not just value? what's the first parameter ? - Field classField = this.getClass().getField(objField.getName()); classField.set(Object,Value) – ufk Jan 24 '10 at 13:39
  • 1
    @ufk: The first parameter is the object for which you want to set the field. Note that you got the `Field` instance by querying the class - there is nothing that links it to a particular instance of that class. – Michael Borgwardt Jan 24 '10 at 13:53
  • and if it is not a primitive ? In my case it's another class (an array of classes which I want to set/change/allocate) – John Jan 22 '15 at 20:57
2
Class<?> actualClass=actual.getClass();

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

The above code would suffice .

object.class.getField("foo");

Unfortunately the above code didn't work for me , since the class had empty field array.

JITHIN_PATHROSE
  • 1,134
  • 4
  • 14
  • 29