`
soleghost
  • 浏览: 42013 次
  • 性别: Icon_minigender_1
  • 来自: 未知
社区版块
存档分类
最新评论

复杂对象的输出--定制toString

 
阅读更多

先来看一个类

public class ComplexObject implements Serializable {

    private static final long         serialVersionUID = -3986831089858789914L;

    private int                    id;

    private String                    name;

    private AccountTypeEnum           type;

    private String                    national;

    private Date                      gmtCreate;

    private Date                      gmtModified;

    private String                    memo;

    private SubType1                 subType1;

    private List<SubType2>            subType2List;

    private final Map<String, String> infoMap          = new HashMap<String, String>();

}

 复杂对象ComplexObject包含了如下属性:

1基本类型:String、枚举、int

2Date对象

3.自定义对象

4.List集合

5.Map对象

 

如果输出的对象更易看清每一个字段的值呢

1.ToStringBuilder的默认style

调用方式:ToStringBuilder.reflectionToString(object)

 

2.ToStringBuilder的默认MULTI_LINE_STYLE

调用方式:ToStringBuilder.reflectionToString(customer,ToStringStyle.MULTI_LINE_STYLE)

 

3.自定制toString方法

 private void getFields(Object obj, StringBuffer str, int level, boolean isListElement)
                                                                                                  throws IllegalArgumentException,
                                                                                                  IllegalAccessException {
        if (obj == null) {
            return;
        }

        Class clazz = obj.getClass();
        if (clazz == ComplexObject.class) {
            str.append(" " + clazz.getSimpleName() + "\n");
            level++;
        }

        // 当前输入对象为List元素
        if (isListElement) {
            for (int i = 0; i < level; i++) {
                str.append("     ");
            }
            str.append("└—— " + clazz.getSimpleName() + "\n");
            level++;
            isListElement = false;
        }

        // 获得当前输入对象声明的所有属性
        Field[] fieldArray = clazz.getDeclaredFields();
        for (Field field : fieldArray) {
            for (int i = 0; i < level; i++) {
                str.append("     ");
            }
            field.setAccessible(true);
            // 当前属性未赋值
            if (field.get(obj) == null) {
                str.append("└—— " + field.getName() + " = " + field.get(obj) + "\n");
            } else if (field.getType() == SubType1.class 
                       || field.getType() == SubType2.class ) {
                str.append("└—— " + field.getName() + "\n");
                getFields(field.get(obj), str, level + 1, false);
            } else if (field.getType() == List.class) {
                str.append("└—— " + field.getName() + "\n");
                List list = (List) field.get(obj);
                for (Object object : list) {
                    getFields(object, str, level + 1, true);
                }
            } else if (field.getType() == Map.class) {
                str.append("└—— " + field.getName() + "\n");
                level++;
                Map map = (Map) field.get(obj);
                Set keySet = map.keySet();
                for (Object key : keySet) {
                    for (int i = 0; i < level; i++) {
                        str.append("     ");
                    }
                    str.append("└—— " + key + " = " + map.get(key) + "\n");
                }
            } else if (field.getType() == Date.class) {
                str.append("└—— "
                           + field.getName()
                           + " = "
                           + new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                               .format((Date) field.get(obj)) + "\n");
            }
            else {
                str.append("└—— " + field.getName() + " = " + field.get(obj) + "\n");
            }
        }

    }

 调用方式:

public String toString() {
        StringBuffer str = new StringBuffer("\n----------------------\n");
        try {
            this.getFields(this, str, 0, false);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        str.append("----------------------\n");
        return str.toString();
    }

输出结构:

 

----------------------
 ComplexObject
     └—— serialVersionUID = -3986831089858789914
     └—— id= 123
     └—— name = ss
     └—— type = PRIVATE_ACCOUNT
     └—— national = null
     └—— createStatus = OPEN
     └—— enableStatus = CAN_USE
     └—— gmtCreate = 2008-09-18 17:42:27
     └—— gmtModified = null
     └—— memo = null
     └—— subType1List
          └—— SubType1
               └—— SubType1属性1= 2088102000419591
               └—— SubType1属性2 = 2
               └—— SubType1属性3 = 3
               └—— SubType1属性4 = 4
               └—— SubType1属性5 = 5        
     └—— SubType2
          └—— SubType2属性1= 1
          └—— SubType2属性2= 2
          └—— SubType2属性3= 3
          └—— SubType2属性4= 4
     └—— infoMap
           └—— key1= value1
           └—— key2= value2
           └—— key3= value3
           └—— key4= value4

使用反射,支持任意对象类型嵌套

分享到:
评论

相关推荐

    C# Tostring 格式化输出字符串全解

    综上所述,C#中的ToString方法结合格式化代码,为数据的文本表示提供了强大的定制能力,无论是基本数值还是复杂的日期时间数据,都能得到精确且美观的文本输出。这对于提高应用程序的用户体验和数据处理的准确性至关...

    打印自定义复杂对象工具类

    "打印自定义复杂对象工具类"就是为了满足这种需求而设计的一个实用工具。它可以帮助开发者便捷地打印出对象内部的属性、嵌套对象以及数组等复杂的数据结构,使得代码的调试过程更为直观。 首先,我们要理解什么是...

    JavaScript Object toString 初始

    这个方法对于理解和调试代码至关重要,因为当你尝试打印或输出一个对象时,JavaScript引擎默认会调用该对象的`toString`方法。本篇文章我们将深入探讨`toString`方法的初始应用,以及它在JavaScript对象中的工作原理...

    C#中ToString格式大全

    总结来说,C#的`ToString()`方法提供了丰富的格式化选项,让开发者能够根据需求定制输出,从简单的数字和货币格式到复杂的日期时间表示,都能轻松应对。理解并熟练运用这些格式化技巧,能显著提升代码的可读性和实用...

    ToString格式大全

    格式化代码是`ToString`方法的关键组成部分,它允许开发者定制输出字符串的格式。这些代码必须用大括号`{}`包围,以区分于普通文本。若要在格式中使用大括号本身,则需使用连续的两个大括号,即`{{`或`}}`。 #### ...

    CString.Format格式化输出和ToString()的一些常用用法.pdf

    2. ToString()方法是所有.NET对象的通用方法,用于将对象转换为字符串形式。它可以通过指定的格式字符串来定制输出格式。 3. 格式化类型包括: - "n":表示数字格式,可以按当前文化或区域设置显示货币值。 - "C...

    C#中tostring格式大全

    在使用`DateTime.ToString()`方法时,可以结合`DateTimeFormatInfo`对象来定制更为复杂的格式,例如使用特定地区的日期时间格式。 总之,`ToString()`和`string.Format`方法是C#中强大的数据转换工具,能够根据需要...

    浅谈Java编程ToString()方法重写的意义

    通过重写`toString()`,我们可以定制输出,如返回`Person`对象的`name`和`age`,即`return "Name: " + p.name + ", Age: " + p.age;`。 2. **重写规则** 重写`toString()`方法意味着子类提供了对父类`toString()`...

    toString()一个会自动调用的方法

    通过重写`toString`,我们可以在需要字符串表示对象时,提供定制化的输出,这对于调试、日志记录或者在用户界面上显示信息都非常有用。然而,需要注意的是,直接修改全局对象(如数组的`toString`)可能会对其他代码...

    json-lib-2.3-jdk15基础jar包合辑

    4. **处理复杂结构**:支持处理嵌套的JSON对象和数组,可以轻松地处理复杂的JSON数据结构。 ### 示例代码 ```java import net.sf.json.JSONObject; import net.sf.json.JSONSerializer; public class JsonDemo { ...

    winform DateTime格式化输出

    `ToString()`方法允许我们根据特定的模式或格式字符串来定制输出。例如,如果我们想要显示“年-月-日”的格式,可以这样写: ```csharp DateTime.Now.ToString("yyyy-MM-dd") ``` 这里的"yyyy-MM-dd"就是一种标准...

    在C#的类或结构中重写ToString方法的用法简介

    默认情况下,这个方法返回的是类型名加上句柄的十六进制表示,这对于调试可能是有用的,但在实际应用中,往往需要根据类的具体信息来定制`ToString()`的输出。 当你创建一个自定义的类或结构时,重写`ToString()`...

    工具类-tools

    4. **对象的深度比较**:`ObjectUtils.equals()`不仅检查对象是否引用相同,还支持深度比较,这在比较复杂对象时很有帮助。 5. **空字符串处理**:`ObjectUtils.isEmpty()`和`ObjectUtils.isNotEmpty()`可以用来...

    commons-lang3-3.3.2

    `ToStringBuilder`则可以帮助生成整洁、易读的调试信息,这对于理解复杂对象的状态非常有用。 在给定的压缩包文件"commons-lang3-3.3.2"中,包含了完整的Apache Commons Lang 3.3.2库的JAR文件。这个JAR文件可以被...

    【MapReduce篇04】MapReduce之OutputFormat数据输出1

    在Hadoop MapReduce框架中,OutputFormat扮演着至关重要...总之,MapReduce的OutputFormat提供了一种灵活的方式,使得开发者可以根据实际需求定制数据输出的格式和位置,这对于满足各种复杂的大数据处理场景至关重要。

    将对象转化为字符串的java实例

    在处理大型复杂对象时,可能需要考虑性能问题,因为`toString()`可能会被频繁调用。在某些情况下,可以考虑只包括部分关键属性,或者使用某种格式化方式来控制输出的长度和内容。 总的来说,理解并正确使用`...

    betwixt详细使用说明

    然而,对于复杂的对象结构或需要高度定制的 XML 格式,可能需要使用更强大的工具,如 JAXB 或 XStream。 总的来说,Betwixt 是一个轻量级的解决方案,适合快速地在 Java beans 和 XML 之间进行简单的转换。如果你的...

    lombok-1.16.6 jar包

    可以使用`includeFieldNames`和`of`属性来定制输出格式。 3. **使用Lombok的好处** - **减少重复代码**: Lombok通过注解自动化生成常规的getter和setter,使代码更加简洁,减少了程序员的工作量。 - **提高代码...

    C#中DateTime的使用方法

    - `ToString()`:以默认格式输出日期时间。 - `ToShortDateString()`:输出短日期格式。 - `ToLongDateString()`:输出长日期格式。 - `ToShortTimeString()`:输出短时间格式。 - `ToLongTimeString()`:输出长时间...

Global site tag (gtag.js) - Google Analytics