Java-метод для назначения значений полей объекта с помощью Reflection - PullRequest
8 голосов
/ 22 сентября 2011

Мне было интересно, возможно ли иметь что-то подобное в 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
    }
 }

Я действительно застрял в методе setField, и любая идея была бы очень полезна.

Спасибо!

РЕДАКТИРОВАТЬ: Причина этого в том, что я хотел бы иметь метод в другом классе, как следующий

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

Ответы [ 3 ]

7 голосов
/ 22 сентября 2011

Конечно:

aField.set(this, aValue);

Чтобы сначала выполнить проверку типа:

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

, но так как вызов set со значением неправильного типа в любом случае сгенерирует IllegalArgumentExceptionтакая проверка не очень полезна.

4 голосов
/ 22 сентября 2011

Хотя я в растерянности относительно того, почему вы хотели бы сделать это так (поскольку у вас уже есть геттеры и сеттеры), попробуйте это:

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

Для получения дополнительной информации, см. .

3 голосов
/ 22 сентября 2011

Я хотел бы предложить map вместо 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...