有什么方法可以自动将自定义类对象转换为人类可读的字符串?
e.g。考虑以下课程:
class Person {
String Name;
int Salary;
...
}
Person p = new Person();
p.setName("Tony");
p.setSalary(1000);
我需要得到类似的东西:
Person: Name="Tony", Salary=1000
答案 0 :(得分:9)
导入Commons Lang您可以使用ToStringBuilder
检查方法reflectionToString(java.lang.Object)
,这将自动创建您期望的表示。
此代码:
Person p = new Person();
p.setName("Tony");
p.setSalary(1000);
System.out.println(ToStringBuilder.reflectionToString(p));
结果是这个字符串:
Person@64578ceb[Name=Tony,Salary=1000]
答案 1 :(得分:3)
这基本上是toString
的用途。但鉴于您希望自动完成此操作,您可以创建一些可以执行此操作的常规服务。使用反射迭代所有字段,然后打印每个字段的名称和值。打印其值的最简单方法是使用它们的toString
,但您也可以在某些情况下以递归方式将它们传递到该打印服务中(当然,您必须找到暂停条件)。
例如,在某些类PrintUtils上有:
public static void printFields(Object o) {
System.out.print(o.getClass.getSimpleName() + ": ");
for (Field field : o.getClass().getDeclaredFields()) {
field.setAccessible(true); // you also get non-public fields
System.out.print(field.getName() + " = " + field.get(o) + ", ");
}
}
当然,您必须处理异常等,并可能更好地格式化输出。此外,这只是在当前类中声明的打印字段。如果您希望在继承层次结构中声明更高的字段,则必须多做一些工作。最后,使用反射比仅使用常规toString
要慢得多。如果可以使用toString
,则最好。
答案 2 :(得分:2)
确保您可以覆盖类的toString
方法。
如下:
class Person {
String name;
int salary;
...
@Override public String toString() {
return "Person: Name='" + name + "', Salary=" + salary;
}
}
请参阅更多详情https://blogs.oracle.com/CoreJavaTechTips/entry/writing_tostring_methods_tech_days
答案 3 :(得分:2)
我认为您可以使用属于ToStringBuilder的commons-lang
。
答案 4 :(得分:0)
class Person {
String Name;
int Salary;
...
@Override
public String toString() {
return "Person: Name = " + Name + "," +
"Salary="+Salary;
}
}
Person p = new Person();
p.setName("Tony");
p.setSalary(1000);
System.out.println(p.toString());
答案 5 :(得分:0)
一种方法是依靠Apache Commons BeanUtils.describe。这将生成Map
bean的属性,通过Map.toString
很好地转换为字符串。如果您想要更多自定义内容,您需要深入了解反射API。
答案 6 :(得分:0)
您可以使用java中的消息格式: https://docs.oracle.com/javase/tutorial/i18n//message.html 单独变量 - 并且你有一个类可读的字符串!