很久以前我就有个想法JAVA能不能方便快捷的打印一个类或对象的全部参数信息,直到有一天我偶然间刷到沉默王二老师的一篇
《如何优雅地打印一个Java对象?》
其中介绍了几种思路
- 重写 toString() 方法
- 使用三方类库或注解
- 。。。。。
但是我感觉实际使用中还是不太方便,那么能不能将其写成一个util呢,这样直接调用是不是比较优雅了呢?然后我发现了一篇《Java反射技术——字段的获取》
以此为基础我完成了下面类信息打印Util
import com.alibaba.fastjson.JSONObject;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
public class ElegantPrintUtil {
public static void print(Object obj) {
try {
System.out.println("------------------------------------------");
System.out.println("打印类名:" + obj.getClass().getName());
System.out.println("开始优雅的打印一个类的全部信息");
Class className = obj.getClass();
Map param = new HashMap<>();
// TODO: 2021/3/16 此处应该可以改进,当前为从子类开始获取上层父类,直到无法获取为止(此时上层父类为空)
// 这样的坏处是需要先获取子类父类全部属性,再获取子类属性重刷,
// 如果三层以上继承可能导致中间层(即是父类又是子类)属性的重写数据,打印为空
for (; className != Object.class; className = className.getSuperclass()) {
//获取本身和父级对象,先获取子类后获取父类
//子类中经常重写父类字段,导致后获取的父类属性会覆盖子类属性,导致字段为空
Field[] fields = className.getDeclaredFields();//获取父类及子类所有私有字段
for (Field field : fields) {
field.setAccessible(true);
param.put(field.getName(), field.get(obj) == null ? "" : field.get(obj));
}
}
//再获取完父类及子类的基础上再次获取子类属性,重刷子类
Field[] fieldSon = obj.getClass().getDeclaredFields();//获取子类所有字段
for (Field field : fieldSon) {
field.setAccessible(true);
param.put(field.getName(), field.get(obj) == null ? "" : field.get(obj));
}
System.out.println(new JSONObject(param).toJSONString());//打印子类所有字段
System.out.println("打印结束");
System.out.println("------------------------------------------");
} catch (Exception e) {
System.out.println("------------------------------------------");
System.out.println("类打印失败");
System.out.println("------------------------------------------");
}
}
}
我将整个打印过程存放于try中,这样即使打印失败也不会影响程序运行,用了一段时间感觉还可以,还算优雅。如果发现存在可以改进的地方欢迎留言,让它变得更加优雅。



