从类中打印所有变量值

Mac*_*rse 65 java reflection

我有一个类,其中包含一个看起来像这样的人的信息:

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.
}
Run Code Online (Sandbox Code Playgroud)

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

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

cle*_*tus 92

实现到字符串:

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();
}
Run Code Online (Sandbox Code Playgroud)

  • commons-lang的[`ReflectionToStringBuilder`](http://commons.apache.org/lang/api-release/org/apache/commons/lang3/builder/ReflectionToStringBuilder.html)中提供了清晰的实现. (13认同)
  • @SivakumarK链接破坏使用:http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/ReflectionToStringBuilder.html (5认同)

Osc*_*han 46

当开源已经很好地完成工作时,你为什么要重新发明轮子?

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

对于apache,这是你如何反思地做到这一点

@Override
public String toString()
{
  return ToStringBuilder.reflectionToString(this);
}
Run Code Online (Sandbox Code Playgroud)

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

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

您可以使用非默认的ToStringStyle "打造"您的打印输出,甚至可以使用您自己的样式进行自定义.

我没有亲自尝试使用Spring ToStringCreator api,但它看起来非常相似.


小智 34

如果您使用的是Eclipse,这应该很简单:

1.按Alt+ Shift+S

2.选择"Generate toString()......"

请享用!你可以拥有toString()的任何模板.

这也适用于getter/setter.


Ste*_*tre 11

通用toString()单行,使用反射和样式定制:

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
...
public String toString()
{
  return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*eld 6

访问字段值时,传递实例而不是null.

为什么不在这里使用代码生成?例如,Eclipse将为您生成一个可重用的toString实现.


Nic*_*tto 5

另一个简单的方法是让您为您Lombok生成toString方法。

为了这:

  1. 只需添加Lombok到您的项目
  2. 将注释添加@ToString到类的定义中
  3. 编译您的类/项目,并完成

例如,在您的情况下,您的类如下所示:

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

    // Getters and setters.
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下的输出示例:

Contact(name=John, location=USA, address=SF, email=foo@bar.com, phone=99999, fax=88888)
Run Code Online (Sandbox Code Playgroud)

有关如何使用注释的@ToString更多详细信息。

注意:您还可以为您Lombok生成吸气剂和吸气剂是完整的功能列表。