将类对象转换为人类可读的字符串



有什么方法可以自动将自定义类对象转换为人类可读的字符串吗?

例如,考虑以下类:

class Person {
    String Name;
    int Salary;
    ...
}
Person p = new Person();
p.setName("Tony");
p.setSalary(1000);

我需要得到类似的东西:

Person: Name="Tony", Salary=1000

导入 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]

确定您可以覆盖类的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

基本上就是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,则最好使用。

我认为您可以使用 ToStringBuilder 作为 commons-lang 的一部分。

一种方法是依靠Apache Commons BeanUtils.describe。这将产生 bean 属性的Map,该属性通过 Map.toString 很好地转换为字符串。如果你想要更多自定义的东西,你需要深入研究反射API。

您可以使用 java 的消息格式:https://docs.oracle.com/javase/tutorial/i18n//message.html将变量分隔为 - 那里有一个人类可读的类字符串!

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

最新更新