ToStringBuilder如何忽略null和空字符串
日常开发中,经常用org.apache.commons.lang3.builder.ToStringBuilder工具类来记录日志,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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)); } } |
输出如下:
1 2 3 | 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或字符串时,仍然会输出,如果想把这些空值给过滤掉,可以参考下面的方法,加一个类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 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)); } } |
再次运行:
1 2 | com.cnblogs.yjmyzz.ToStringTest$DemoObject@1786dec2 ToStringTest.DemoObject[c=abc,d=Sun May 08 07:43:01 CST 2022] |
从输出上看,null值以及空字符串都被成功过滤掉了
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步