打印类中的所有变量值

2022-08-31 12:27:37

我有一个类,其中包含有关人员的信息,如下所示:

public class Contact {
    private String name;
    private String location;
    private String address;
    private String email;
    private String phone;
    private String fax;

    public String toString() {
        // Something here
    }
    // Getters and setters.
}

我想返回所有变量。我试图使用反射来实现它,如这个问题所示,但我无法设法打印实例变量。toString()this.name +" - "+ this.locations + ...

解决这个问题的正确方法是什么?


答案 1

实施到String

public String toString() {
  StringBuilder result = new StringBuilder();
  String newLine = System.getProperty("line.separator");

  result.append( this.getClass().getName() );
  result.append( " Object {" );
  result.append(newLine);

  //determine fields declared in this class only (no fields of superclass)
  Field[] fields = this.getClass().getDeclaredFields();

  //print field names paired with their values
  for ( Field field : fields  ) {
    result.append("  ");
    try {
      result.append( field.getName() );
      result.append(": ");
      //requires access to private field:
      result.append( field.get(this) );
    } catch ( IllegalAccessException ex ) {
      System.out.println(ex);
    }
    result.append(newLine);
  }
  result.append("}");

  return result.toString();
}

答案 2

为什么你想重新发明轮子,因为有开源已经做得很好。

apache common-langsspring都支持一些非常灵活的构建器模式

对于apache,这是你如何反思它

@Override
public String toString()
{
  return ToStringBuilder.reflectionToString(this);
}

如果您只想打印您关心的字段,请按照以下步骤操作。

@Override
public String toString() 
{
    return new ToStringBuilder(this)
      .append("name", name)
      .append("location", location)
      .append("address", address)
      .toString(); 
}

您甚至可以使用非默认的ToStringStyle“设置”打印输出的样式,甚至可以使用自己的样式对其进行自定义。

我没有亲自尝试弹簧ToStringCreator api,但它看起来非常相似。