如何通过reflection来获取对象中的字段?

我有一个Java对象(基本上是一个VO),我不知道它的types。
我需要得到那个对象不是null的值。

如何才能做到这一点?

您可以使用Class#getDeclaredFields()来获取该类的所有声明字段。 您可以使用Field#get()来获取值。

简而言之:

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

要了解有关reflection的更多信息,请查看相关主题的Sun教程 。


也就是说,这些字段并不一定代表一个VO的属性。 您宁愿确定以getis开头的公共方法,然后调用它来获取实际的属性值。

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

反过来说,可能有更优雅的方法来解决你的实际问题。 如果您详细阐述一下您认为这是正确的解决scheme的function要求,那么我们可能会提出正确的解决scheme。 有许多工具可用于按摩javabeans。

这是一个快速和肮脏的方法,以通用的方式做你想做的事情。 您将需要添加exception处理,您可能需要将BeanInfotypescaching在弱散列映射中。

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

看到这些参考资料

  • BeanInfo (JavaDoc)
  • Introspector.getBeanInfo(class) (JavaDoc)
  • 内省 (Sun Java教程)

我有一个Java对象(基本上是VO),我不知道它的types。 我需要得到那个对象不是null的值。

也许你不需要反思 – 这是一个简单的OOdevise ,可以解决你的问题:

  1. 添加一个接口Validation ,揭示一个方法validate哪些检查字段,并返回适当的东西。
  2. 实现所有VO的接口和方法。
  3. 当你得到一个VO,即使它的具体types是未知的,你可以将其转换为Validation并轻松检查。

我想你需要的字段是null以通用的方式显示错误消息,所以这应该是足够的。 让我知道如果出于某种原因,这不适合你。