¿Hay una mejor manera de obtener los captadores de campo de un objeto que no sean la API de reflexión de java o estoy utilizando incorrectamente el método getReadMethod de PropertyDescriptor?

Contexto:

Estoy creando un documento de Excel de una manera genérica con los datos que recibo de un punto final de servicio SOAP. Recibo los datos como una Lista y tengo el modelo (JavaBeans) para cada Objeto que recibo de acuerdo con el método llamado. Así que configuro la primera fila de la hoja como encabezado de los campos del objeto (getDeclaredFields). Luego continúo llenando la columna fila por fila con valores de la lista de objetos.

El problema:

No he encontrado una forma viable de obtener los valores de campo del objeto. He intentado usar los captadores con la API de reflexión de java con algo como https://stackoverflow.com/a/5503534/4807777 findGetterName, findGetter sin embargo, el getName del descriptor de propiedades a veces es un caso de letra diferente del nombre de campo como se obtiene del getDeclaredFields de la clase.

Digamos que superé esto con mayúsculas en ambos nombres, el método getReadMethod falla, no parece encontrar adeptos para los campos que usan el prefijo es (es decir, campos booleanos). No sé si lo estoy usando mal o si es un error (la depuración de getReadMethod parece funcionar solo con el prefijo de obtención, aunque parece manejar el caso de prefijo para los booleanos).

Teniendo en cuenta el hecho de que los campos no son accesibles fuera del paquete del objeto, por lo tanto, únicamente a través de invocadores get.

¿Hay una mejor manera de obtener los captadores de campo del objeto o me estoy perdiendo algo con los métodos de obtención?


Actualización: Spring’s BeanUtils parece ser mejor para obtener las propiedades con su getPropertyDescriptors es mejor que el getDeclaredFields de Java Class, cuando las propiedades de JavaBean se asignan a elementos XML.

Esto soluciona la situación de los diferentes casos de letras. Sin embargo, todavía no encuentra readMethod cuando no usa el prefijo get.


Editado: para mostrar un ejemplo de que getReadMethod no encuentra el getter con prefijo, como solicitó Laszlo Lugosi.

Una clase simple:

class Test { private String assignmentType; private Boolean conserved; public String getAssignmentType() {return assignmentType;} public void setAssignmentType(String assignmentType) {this.assignmentType = assignmentType;} public Boolean isConserved() {return conserved;} public void setConserved(Boolean conserved) {this.conserved = conserved;} } 

Ejecute esto con el findGetter y findGetterName escrito en la respuesta vinculada arriba:

 { Test obj = new Test(); obj.setAssignmentType("someType"); obj.setConserved(true); Field[] fields = obj.getClass().getDeclaredFields(); String fieldName; for (int i=0;i<fields.length;i++){ fieldName = fields[i].getName(); java.lang.reflect.Method method; Object val = null; try { method = obj.getClass().getMethod(findGetterName(obj.getClass(),fieldName)); val = method.invoke(obj); } catch (Exception e){ e.printStackTrace(); } } } 

Editado 2 Aunque podría escribir simplemente un método GetRead siguiendo la convención que Laszlo Lugosi destacó, prefiero encontrar una API para manejar los accesores.

Como usted sabe solo el nombre del campo del objeto, y JavaBean tiene una convención, puede averiguar fácilmente los captadores. Las reglas son getUpperfieldname () y isUpperfieldname si el campo es booleano. Y también puede averiguar el tipo de retorno en el campo de objeto.