Come ottenere i campi in un object tramite riflessione?

Ho un object (fondamentalmente un VO) in Java e non conosco il suo tipo.
Ho bisogno di ottenere valori che non sono nulli in quell’object.

Come si può fare?

È ansible utilizzare Class#getDeclaredFields() per ottenere tutti i campi dichiarati della class. Puoi usare Field#get() per ottenere il valore.

In breve:

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

Per ulteriori informazioni sulla riflessione, consulta il tutorial Sun sull’argomento .


Detto questo, i campi non rappresentano necessariamente tutte le proprietà di un VO. Preferisci determinare i metodi pubblici che iniziano con get o is e quindi richiamarli per get i valori delle proprietà reali .

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

Che a sua volta ha detto, ci possono essere modi più eleganti per risolvere il tuo problema reale. Se elabori un po ‘di più sui requisiti funzionali per i quali pensi che questa sia la soluzione giusta, allora potremmo essere in grado di suggerire la soluzione giusta. Ci sono molti, molti strumenti disponibili per massaggiare javabeans.

Ecco un metodo veloce e sporco che fa ciò che vuoi in modo generico. Dovrai aggiungere la gestione delle eccezioni e probabilmente vorrai memorizzare nella cache i tipi di BeanInfo in una weakhashmap.

 public Map getNonNullProperties(final Object thingy) { final Map nonNullProperties = new TreeMap(); 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; } 

Vedi questi riferimenti:

  • BeanInfo (JavaDoc)
  • Introspector.getBeanInfo (class) (JavaDoc)
  • Introspection (Sun Java Tutorial)

Ho un object (fondamentalmente un VO) in Java e non conosco il suo tipo. Ho bisogno di ottenere valori che non sono nulli in quell’object.

Forse non è necessario un riflesso per questo – ecco un semplice design OO che potrebbe risolvere il tuo problema:

  1. Aggiungi un’interfaccia Validation che espone un metodo di validate che controlla i campi e restituisce qualsiasi cosa sia appropriata.
  2. Implementa l’interfaccia e il metodo per tutti i VO.
  3. Quando si ottiene un VO, anche se il tipo concreto è sconosciuto, è ansible convertirlo in Validation e verificarlo facilmente.

Suppongo che sia necessario il campo null per visualizzare un messaggio di errore in modo generico, quindi dovrebbe essere sufficiente. Fammi sapere se questo non funziona per te per qualche motivo.