Java 使用ReflectionStringBuilder更改类型的特定出现的输出

Java 使用ReflectionStringBuilder更改类型的特定出现的输出,java,tostring,apache-commons-lang,Java,Tostring,Apache Commons Lang,我正在使用Apache Common StringBuilder递归地为我的实体提供一个toString 我有一个定制的toString样式,我用它来给我一个稍微修改过的输出,我省略了一些我不想出现的变量 我的问题是,对于特定的对象类型,是否可以指定要打印的特定属性 例如: 我有两个Person对象,每个都有一个ID值,还有一个关系对象BestFriend public class Person { int id; String name; int age; Person bestfiend;

我正在使用Apache Common StringBuilder递归地为我的实体提供一个toString

我有一个定制的toString样式,我用它来给我一个稍微修改过的输出,我省略了一些我不想出现的变量

我的问题是,对于特定的对象类型,是否可以指定要打印的特定属性

例如: 我有两个Person对象,每个都有一个ID值,还有一个关系对象BestFriend

public class Person {

int id;
String name;
int age;
Person bestfiend;


public void setBestFriend(Person bestFriend){
    this.bestfiend = bestFriend;
  }
}
当前发生的情况是,当我将两个人对象链接为Bestfriends时,ReflectionStringBuilder正在为Bestfriends的值编写整个Person对象

Person[  
id = 0001  
name = John  
age = 25  
bestFriend=Person@25eb3d2[  
                id = 0002  
                name = Mary  
                age = 29  
                ]  
]  
您可以指定为所有关系对象提供ID值,而不是整个Person对象的值吗

Person[  
id = 0001  
name = John  
age = 25  
bestFriend= 0002  

下面的代码片段显示了如何有选择地排除BestFriend字段,然后只添加ID值。您必须检查null以避免NPE

@Override
public String toString() {
  ReflectionToStringBuilder builder = new ReflectionToStringBuilder(this);
  builder.setExcludeFieldNames("bestfriend");
  builder.append("bestfriend", (bestfriend == null) ? "None" : bestfriend.id);
  return builder.build();
}

ReflectionStringBuilder
类仅允许排除字段,而不允许更改字段的打印方式。您可以改为使用
ToStringBuilder
类来定义如何从
toString()
方法中打印
Person
。您好,我已经实现了一个类,该类扩展了ToStringStyle以提供自定义输出(主要是格式化),我可以在该类中指定来执行所需的行为吗,虽然那可能会有点毛茸茸的。您是否有任何理由必须使用
ReflectionStringBuilder
而不是
ToStringBuilder
?使用后者,只需添加好友的ID字段就容易多了。唯一的原因是,您可以添加和删除字段,而无需担心添加/删除toString方法。