Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java method to assign object field values with Reflection

I was wondering whether it would be possible to have something like the following in Java:

public class MyClass {
    private String name;
    private Integer age;
    private Date dateOfBirth;
    // constructors, getters, setters

    public void setField(String aFieldName, Object aValue) {
        Field aField = getClass().getDeclaredField(aFieldName);
        // use: aField.set(...) with proper type handling
    }
 }

I am really stuck in the setField method and any idea would be very helpful.

Thanks!

EDIT: The reason for this is that I would like to have a method in another class like the following

public static MyClass setAll(List<String> fieldNames, List<Object> fieldValues) {
    MyClass anObject = new MyClass();
    // iterate fieldNames and fieldValues and set for each fieldName 
    // the corresponding field value
    return anObject;
}
like image 981
gpol Avatar asked Sep 22 '11 06:09

gpol


3 Answers

Sure:

aField.set(this, aValue);

To do type checking first:

if (!aField.getType().isInstance(aValue))
    throw new IllegalArgumentException();

but since calling set with a value of the wrong type will generate an IllegalArgumentException anyway, that sort of check isn't very useful.

like image 107
Chris Jester-Young Avatar answered Oct 13 '22 00:10

Chris Jester-Young


Though I'm at a loss as to why you would want to do it like that (since you already have getters and setters), try this:

Field aField = getClass().getDeclaredField(aFieldName);
aField.set(this, aValue);

For more info, see this.

like image 28
Pål Brattberg Avatar answered Oct 12 '22 23:10

Pål Brattberg


I'd like to suggest a map instead of List<T>.

 for(Map.Entry<String,Object> entry:map.entrySet())
  {
    Field aField = anObject.getClass().getDeclaredField(entry.getKey());
    if(entry.getValue().getClass().equals(aField.getType()))
         aField.set(anObject,entry.getValue());
  }
return anObject;
like image 26
KV Prajapati Avatar answered Oct 13 '22 00:10

KV Prajapati