栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

优雅的打印一个类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

优雅的打印一个类

优雅的打印一个类

很久以前我就有个想法JAVA能不能方便快捷的打印一个类或对象的全部参数信息,直到有一天我偶然间刷到沉默王二老师的一篇
《如何优雅地打印一个Java对象?》

其中介绍了几种思路

  1. 重写 toString() 方法
  2. 使用三方类库或注解
  3. 。。。。。

但是我感觉实际使用中还是不太方便,那么能不能将其写成一个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中,这样即使打印失败也不会影响程序运行,用了一段时间感觉还可以,还算优雅。如果发现存在可以改进的地方欢迎留言,让它变得更加优雅。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/601336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号