ToStringBuilder如何忽略null和空字符串
日常开发中,经常用org.apache.commons.lang3.builder.ToStringBuilder工具类来记录日志,比如:
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)); } }
输出如下:
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或字符串时,仍然会输出,如果想把这些空值给过滤掉,可以参考下面的方法,加一个类:
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)); } }
再次运行:
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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。