前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ToStringBuilder如何忽略null和空字符串

ToStringBuilder如何忽略null和空字符串

作者头像
菩提树下的杨过
发布2022-05-09 16:12:11
9650
发布2022-05-09 16:12:11
举报

日常开发中,经常用org.apache.commons.lang3.builder.ToStringBuilder工具类来记录日志,比如:

代码语言:javascript
复制
package com.cnblogs.yjmyzz;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import java.util.Date;

/**
 * @author 菩提树下的杨过
 * @className ToStringTest
 * @description TODO
 * @date 2022/5/8 07:24
 */
public class ToStringTest {


    static class DemoObject {
        private String a;
        private String b = "";
        private String c = "abc";
        private Date d = new Date();
        private Integer e;
    }



    public static void main(String[] args) {
        DemoObject obj = new DemoObject();
        //原始toString()
        System.out.println(obj);
        
        //ToStringBuilder的输出(默认风格)
        System.out.println(ToStringBuilder.reflectionToString(obj));
        
        //ToStringBuilder的输出(短前缀风格)
        System.out.println(ToStringBuilder.reflectionToString(obj, ToStringStyle.SHORT_PREFIX_STYLE));
    }
}

输出如下:

代码语言:javascript
复制
com.cnblogs.yjmyzz.ToStringTest$DemoObject@1786dec2
com.cnblogs.yjmyzz.ToStringTest$DemoObject@1786dec2[a=<null>,b=,c=abc,d=Sun May 08 07:35:50 CST 2022,e=<null>]
ToStringTest.DemoObject[a=<null>,b=,c=abc,d=Sun May 08 07:35:50 CST 2022,e=<null>]

从结果上看:

行1:也就是Object默认的toString()输出,只有类名以及对象实例的hashCode,内部成员信息完全看不出来

行2:使用ToStringBuilder工具类输出对象信息,包含了几乎所有完整信息

行3:如果觉得行2的输出,类名太长,可以指定短前缀风格

但是不管是行2还是行3的风格,当field值为null或字符串时,仍然会输出,如果想把这些空值给过滤掉,可以参考下面的方法,加一个类:

代码语言:javascript
复制
package com.cnblogs.yjmyzz;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import java.lang.reflect.Field;
import java.util.Date;

/**
 * @author 菩提树下的杨过
 * @className ToStringTest
 * @description TODO
 * @date 2022/5/8 07:24
 */
public class ToStringTest {


    static class DemoObject {
        private String a;
        private String b = "";
        private String c = "abc";
        private Date d = new Date();
        private Integer e;
    }

    /**
     * 新增的工具类
     */
    static class ToStringUtil {
        public static String toStringWithAttributes(Object ofInterest, ToStringStyle style) {
            ReflectionToStringBuilder builder = new ReflectionToStringBuilder(ofInterest, style) {
                @Override
                protected boolean accept(Field field) {
                    try {
                        Object value = field.get(ofInterest);
                        return super.accept(field) && value != null && !"".equalsIgnoreCase(value.toString());
                    } catch (IllegalAccessException e) {
                        return super.accept(field);
                    }
                }
            };
            return builder.toString();
        }
    }

    public static void main(String[] args) {
        DemoObject obj = new DemoObject();
        //原始toString()
        System.out.println(obj);

        //去掉null和空字符串的输出
        System.out.println(ToStringUtil.toStringWithAttributes(obj, ToStringStyle.SHORT_PREFIX_STYLE));

    }
}

再次运行:

代码语言:javascript
复制
com.cnblogs.yjmyzz.ToStringTest$DemoObject@1786dec2
ToStringTest.DemoObject[c=abc,d=Sun May 08 07:43:01 CST 2022]

从输出上看,null值以及空字符串都被成功过滤掉了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档