Pregunta

Por ejemplo, tengo algunas clases con varios campos, uno de ellos es como a continuación, quiero generar todos los campos de su instancia, sin embargo, debo obtener el mapeo entre el nombre del miembro con los métodos de Getter, ¿puedo obtenerlo por reflexión?

public class MappingMemberWithGetterOrSetter {
private String memberOne;
private int memberTwo;

public String getMemberOne() {
    return memberOne;
}

public void setMemberOne(String memberOne) {
    this.memberOne = memberOne;
}

public int getMemberTwo() {
    return memberTwo;
}

public void setMemberTwo(int memberTwo) {
    this.memberTwo = memberTwo;
}
}
¿Fue útil?

Solución

Quizás esto es lo que quieres. Con el Introspector puedes conseguir el Beaninfo y esto te da acceso a los frijoles Descriptores de propiedades.

BeanInfo beanInfo = Introspector.getBeanInfo(MappingMemberWithGetterOrSetter.class, Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
    String propertyName = propertyDescriptor.getName();
    Method getter = propertyDescriptor.getReadMethod();
    Method setter = propertyDescriptor.getWriteMethod();
    Field field = MappingMemberWithGetterOrSetter.class
                .getDeclaredField(propertyName);
    System.out.println("Property " + propertyName + " field:  " + field);
    System.out.println("Getter " + getter);
    System.out.println("Setter " + setter);
}

Otros consejos

¿Es esto lo que quieres?

Class aClass = ...//obtain class object
Field[] methods = aClass.getFields(); 

Field field = ... //obtain field object
String fieldName = field.getName();

Después de eso, puede acceder a Getter y Setter del campo a través de

Object value = field.get(objectInstance);

field.set(objetInstance, value);

donde ObjectInstance es una instancia de la clase que posee el campo.

Getter y/o setter define una propiedad en Java. Si tienes un getLength método sin parámetro y con un valor de retorno, entonces tiene una propiedad legible nombrada length. Si tiene un método llamado setLength(Type value) Entonces tienes una propiedad escritable llamada length. Si tiene ambos, entonces la propiedad es legible y es escrito.

Los campos no están involucrados en la definición de una propiedad Java. Cómo y si respalda sus propiedades con campos depende de usted.

public long getDoubleLength() { return getLength()*2; }

constituye una propiedad de nombre de solo lectura doubleLength. No existe un campo para esta propiedad.

Entonces, lo que quieres no es posible en general. Si desea hacerlo para clases propias específicas donde sabe que existe esta asignación o si desea probar otras clases para este patrón, puede obtener métodos y campos a través de la reflexión y verificar si existe los campos con los nombres de propiedad.

Pero esto puede no funcionar todo el tiempo. Algunas personas usan convenciones como _member o mField para los nombres de campo. Esto está completamente a la par con la definición de Java Beans, donde las propiedades son definidas por Getters y Setters, pero se romperán con el enfoque ingenuo de los nombres coincidentes.

public void getMethods(Class<?> className)
{                   
         Method[] methods = className.getMethods();             
         for(Method method : methods)
            {
           if(method.getDeclaringClass().getName().equalsIgnoreCase("java.lang.Object") )
             {
                 //Do nothing
             }
             else
             {
                if(StringUtils.startsWith( method.getName(),"get"))
                    {   
                        //Here u ll get all get methods                         
                    }
             }                              
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top