49
A
回答
91
您可以使用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);
}
}
要了解更多关于反思,检查Sun tutorial on the subject。
这就是说,场不一定所有代表VO的性质。您宁愿确定以get
或is
开头的公共方法,然后调用它以获取实际属性值。
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);
}
}
}
这反过来说,有可能是解决您最实际的问题更优雅的方式。如果您详细阐述您认为这是正确的解决方案的功能要求,那么我们可能会提出正确的解决方案。有很多,许多工具可用于按摩javabeans。
1
我有一个对象(基本上是VO)在 Java中,我不知道它的类型。我需要获得那个对象中不为null的值。
也许你该做的没有必要需要反思 - 这里是一个纯面向对象的设计可能会解决你的问题:
- 添加的接口
Validation
其暴露的方法validate
,它检查字段并返回适当的内容。 - 实现所有VO的接口和方法。
- 当你得到一个VO,即使它是具体类型是未知的,你可以将它转换为
Validation
并检查。
我想你需要的字段是null以通用的方式显示错误消息,所以这应该足够了。让我知道如果出于某种原因这对你不起作用。
10
下面是一个快速和肮脏的方法,以通用的方式做你想做的事情。您需要添加异常处理,并且您可能需要将BeanInfo类型缓存在弱散列映射中。
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的)
- Introspection(的Sun Java 教程)
相关问题
- 1. 通过反射获取子类字段
- 2. 通过反射在对象中获取字段和它们的值Java
- 3. 如何通过反射属性获取变量/字段名称?
- 4. 如何使用反射从字段/类获取对象?
- 5. Java反射 - 获取当前字段值中存在的对象
- 6. 反射通用获取字段值
- 7. 如何在支持字段存在时通过反射来获取类字段?
- 8. 如果通过使用反射创建对象,那么获取?
- 9. 在运行时通过反射获取通用字段类型
- 10. 通过反射得到嘲笑对象的字段值
- 11. 通过C#中的反射获取对某些类字段的引用
- 12. 通过反射获取XmlRootAttribute.ElementName
- 13. 通过具有反射C的属性获取私有字段#
- 14. Lua - 反射 - 获取对象上函数/字段的列表?
- 15. 从字段获取对象的实例,反射
- 16. 在C#反射获取从对象的字段和值
- 17. 支持获取嵌套对象字段值的java反射库。
- 18. 使用反射,获取对象的父类/字段
- 19. 通过反射获取Java字段,但不是通过字符串名称获取Java字段
- 20. 如何通过反射在单个调用中获取字段和属性?
- 21. Java。如何通过反射获得不可空字段?
- 22. 无法通过反射来获取字段值hibernate JPA + GF 4
- 23. 获取与注释,字段列表通过使用反射
- 24. 通过反射COM对象获取属性名称
- 25. 通过反射获取特定的公共字段(对于所有父类)
- 26. 如何通过字段名称获取相关对象?
- 27. 通过对象的递归反射
- 28. 如何从glassmapper映射的对象属性获取sitecore字段?
- 29. 如何通过反射访问抽象父类中的实例字段?
- 30. 反射获取FieldInfo对象的类型?
如果我有修改字段i的值n对象?修改gte当前值执行某些操作,然后将其添加回Object? – 2017-11-29 09:18:49