我有一个Person
包含 3 个变量的 Java bean 类:
- 名称(字符串)
- 年龄(字符串)
- 地址(对象)。
Address
包含 3 个变量:
- 街道
- 门号
- 城市
我想要一个实用程序,它应该在Person
.
我的意思是它应该打印Person
以及其中Address
包含的对象。
我可以创建一个哈希图并使用反射放置变量名称和值,并在 JSP 中打印键/值 UI,但问题是我必须应用反射Address
才能在哈希图中添加变量/值。
是否有可用的实用程序来执行此操作?
我有一个Person
包含 3 个变量的 Java bean 类:
Address
包含 3 个变量:
我想要一个实用程序,它应该在Person
.
我的意思是它应该打印Person
以及其中Address
包含的对象。
我可以创建一个哈希图并使用反射放置变量名称和值,并在 JSP 中打印键/值 UI,但问题是我必须应用反射Address
才能在哈希图中添加变量/值。
是否有可用的实用程序来执行此操作?
您可以使用Apache Commons的ToStringBuilder。
从文档:
此方法的典型调用如下所示:
public String toString() { return ToStringBuilder.reflectionToString(this); }
更多细节:
此类可以为任何类或对象构建良好且一致的 toString()。此类旨在通过以下方式简化流程:
允许处理所有类型的字段名称 一致地处理空值 一致地输出数组和多维数组 允许为对象和集合控制详细级别 处理类层次结构 要使用此类,请编写如下代码:
public class Person { String name; int age; boolean smoker; ... public String toString() { return new ToStringBuilder(this). append("name", name). append("age", age). append("smoker", smoker). toString(); } }
或者,有一种方法使用反射来确定要测试的字段。因为这些字段通常是私有的,所以反射ToString 方法使用 AccessibleObject.setAccessible 来更改字段的可见性。除非正确设置了适当的权限,否则这将在安全管理器下失败。它也比显式测试慢。此方法的典型调用如下所示:
public String toString() { return ToStringBuilder.reflectionToString(this); }
您可能正在寻找 Apache Commons ToStringBuilder#reflectionToString(Object)
。
您可能会发现 Jackson JSON 序列化程序对此很有用。Jackson 库可能已经成为您堆栈的一部分。如果没有,请在下面找到所需的依赖项。
private static final ObjectMapper OBJECT_MAPPER_SINGLETON = new ObjectMapper();
public static String toStringUsingJackson(final Object object) {
try {
return OBJECT_MAPPER_SINGLETON.writeValueAsString(object);
} catch (final JsonProcessingException e) {
return String.valueOf(object);
}
}
样本输出:
{"name":"John Doe","age":42}
所需的 maven/gradle 依赖项:
您可以实现toString
打印出任何您想要的方法,或者您可以使用 Apache Commons ToStringBuilder
http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/builder/ToStringBuilder.html及其reflectionToString
方法. 我不相信这会通过属性递归(例如地址),但如果你想看到用街道、门号和城市打印出来的地址,请使用实现它的toString
方法来打印该信息。