2011-09-22 30 views
8

Me preguntaba si sería posible tener algo como lo siguiente en Java:método Java para asignar valores de campo de objeto con la reflexión

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

estoy realmente atascado en el método setField y cualquier idea sería muy servicial.

Gracias!

EDIT: La razón de esto es que me gustaría tener un método en otra clase como el siguiente

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

Respuesta

7

Claro:

aField.set(this, aValue); 

Para hacer la comprobación de tipos en primer lugar:

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

pero desde que llama al set con un valor del tipo incorrecto generará un IllegalArgumentException de todos modos, ese tipo de control no es muy útil.

+1

Sí Probé esto pero el problema es que me gustaría agregar algún tipo de comprobación de tipo y conversión adecuada en el método. ¿Algunas ideas? – gpol

+0

Puede hacer la verificación de tipos si lo desea (pero si todo lo que hace con un cheque fallido es tirar, entonces eso no tiene sentido, ya que el mecanismo de reflexión se lanzará por usted). Ningún casting será apropiado. –

4

Aunque estoy en una pérdida en cuanto a por qué desea hacerlo así (ya que ya tiene captadores y definidores), intente esto:

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

Para obtener más información, see this.

+0

tonto de mi parte Edité mi pregunta para explicar por qué la quiero. – gpol

+0

OK, ¿la respuesta es lo suficientemente buena entonces? Si lo desea, también tiene versiones más especializadas de 'set', como' setLong', 'setFloat',' setBoolean', etc. Consulte el Javadoc al que se hace referencia. –

3

Me gustaría sugerir un map en lugar de 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; 
Cuestiones relacionadas