ReflectionToStringBuilder的使用分析与优化

昨天看视频无意间看到这个工具,终于不用重写toString方法了。

相对于toString方法,代码简洁 , 无须任何配置, Model 属性变化 , 无需修改 toString

缺陷:安全性问题 , 反射私有属性值也会暴露 .
为了防止暴露,我们可以重写accept方法,剔除不想暴露的属性。

改进:利用ToStringBuilder弥补(通过 ReflectionToStringBuilder 子类 , 覆盖其 accept 方法来加以筛选 )

示例代码如下:

public String toString() {

    return (new ReflectionToStringBuilder(this) {

        protected boolean accept(Field f) {

        return super.accept(f) && !f.getName().equals(“password”);

    }}).toString();
}

代码解释: toString 方法会跳过名为 password 属性

ToStringStyle 抽象类与设计模式

ToStringBuilder 封装 的三个属性 :
/**

  • Current toString buffer, not null.

*/

private final StringBuffer buffer;//封装最终结果

/**

  • The object being output, may be null.

*/

private final Object object;//toString 对象

/**

  • The style of output to use, not null.

*/

private final ToStringStyle style;

关于类型ToStringStyle 在 ToStringBuilder 源码中的利用 ,

ToStringBuilder 类中所有的方法 append 都是通过调用属性 style 相应方法实现 .

ToStringStyle 设计模式 : 单例模式的衍生,返回子类对象

本文小结 :

①ToStringBuilder分而治之, 通过属性 ToStringBuilder 来分离功能的调用与实现 . ②子类达到多态的单例少见, 通过子类 StandardToStringStyle 提供了一个更为灵活的扩展 .

③具体实现大家可以参考 ReflectionToStringBuilder 源码 .

你可能感兴趣的:(java)