2010-06-07 10 views

Respuesta

91

Puede usar Class#getDeclaredFields() para obtener todos los campos declarados de la clase. Puede usar Field#get() para obtener el valor.

En resumen:

Object someObject = getItSomehow(); 
for (Field field : someObject.getClass().getDeclaredFields()) { 
    field.setAccessible(true); // You might want to set modifier to public first. 
    Object value = field.get(someObject); 
    if (value != null) { 
     System.out.println(field.getName() + "=" + value); 
    } 
} 

Para obtener más información sobre la reflexión, comprobar el Sun tutorial on the subject.


Dicho esto, los campos no necesariamente todos representan propiedades de un VO. Desea determinar los métodos públicos comenzando con get o is y luego invocarlo para obtener los valores de la propiedad real.

for (Method method : someObject.getClass().getDeclaredMethods()) { 
    if (Modifier.isPublic(method.getModifiers()) 
     && method.getParameterTypes().length == 0 
     && method.getReturnType() != void.class 
     && (method.getName().startsWith("get") || method.getName().startsWith("is")) 
    ) { 
     Object value = method.invoke(someObject); 
     if (value != null) { 
      System.out.println(method.getName() + "=" + value); 
     } 
    } 
} 

A su vez, dijo, puede haber formas más elegantes para resolver su problema real. Si elabora un poco más sobre los requisitos funcionales para los que cree que esta es la solución correcta, entonces podemos sugerir la solución adecuada. Hay muchas, muchas herramientas disponibles para masajear javabeans.

+0

¿Qué pasa si tengo que modificar el valor del campo i n objeto? Modificar como valor actual gte realizar algo y luego agregarlo de nuevo a Objeto? –

1

Tengo un objeto (básicamente un VO) en Java y no sé su tipo. Necesito obtener valores que no sean nulos en ese objeto.

Tal vez no lo hace necesaria la reflexión necesidad de que - aquí es un diseño sencillo OO que podría resolver su problema:

  1. Añadir una interfaz Validation que exponen un método que comprueba el validate campos y devolver lo que sea apropiado.
  2. Implemente la interfaz y el método para todo el VO.
  3. Cuando obtiene un VO, incluso si es el tipo de concreto es desconocido, puede encasillarlo en Validation y comprobarlo fácilmente.

Supongo que necesita el campo que es nulo para mostrar un mensaje de error de una manera genérica, por lo que debería ser suficiente. Avíseme si esto no funciona para usted por alguna razón.

10

Aquí hay un método rápido y sucio que hace lo que quiere de una manera genérica. Tendrá que agregar el manejo de excepciones y probablemente quiera almacenar en caché los tipos de BeanInfo en un mapa débil.

public Map<String, Object> getNonNullProperties(final Object thingy) { 
    final Map<String, Object> nonNullProperties = new TreeMap<String, Object>(); 
    try { 
     final BeanInfo beanInfo = Introspector.getBeanInfo(thingy 
       .getClass()); 
     for (final PropertyDescriptor descriptor : beanInfo 
       .getPropertyDescriptors()) { 
      try { 
       final Object propertyValue = descriptor.getReadMethod() 
         .invoke(thingy); 
       if (propertyValue != null) { 
        nonNullProperties.put(descriptor.getName(), 
          propertyValue); 
       } 
      } catch (final IllegalArgumentException e) { 
       // handle this please 
      } catch (final IllegalAccessException e) { 
       // and this also 
      } catch (final InvocationTargetException e) { 
       // and this, too 
      } 
     } 
    } catch (final IntrospectionException e) { 
     // do something sensible here 
    } 
    return nonNullProperties; 
} 

ver estas referencias:

Cuestiones relacionadas