我在 Java 中有一个对象(基本上是一个 VO),但我不知道它的类型。
我需要获取该对象中不为空的值。
如何才能做到这一点?
原文由 Swapna 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在 Java 中有一个对象(基本上是一个 VO),但我不知道它的类型。
我需要获取该对象中不为空的值。
如何才能做到这一点?
原文由 Swapna 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是一种快速而肮脏的方法,可以以通用方式执行您想要的操作。您需要添加异常处理,并且您可能希望将 BeanInfo 类型缓存在 weakhashmap 中。
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;
}
请参阅这些参考资料:
原文由 Sean Patrick Floyd 发布,翻译遵循 CC BY-SA 2.5 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
您可以使用
Class#getDeclaredFields()
获取该类的所有声明字段。您可以使用Field#get()
获取该值。简而言之:
要了解有关反射的更多信息,请查看 有关该主题的 Oracle 教程。
也就是说,如果那个 VO 是一个完全有价值的 Javabean,那么这些字段不一定代表一个 VO 的 真实 属性。您更愿意确定以
get
或is
开头的公共方法,然后调用它来获取实际属性值。反过来说,可能有更优雅的方法来解决您的实际问题。如果您详细说明您认为这是正确解决方案的功能需求,那么我们可能会建议正确的解决方案。有很多 很多 工具可以用来按摩 javabean。 Java SE 甚至在
java.beans
包中提供了一个内置的。