利用Java Reflect机制编写万能toString()方法

package com.accp.test.filed;

 

import java.lang.reflect.AccessibleObject;

import java.lang.reflect.Array;

import java.lang.reflect.Field;

import java.lang.reflect.Modifier;

import java.util.ArrayList;

import java.util.List;

 

public class ObjectAnalyzer {

 

    private List<Object> visited = new ArrayList<Object>();

 

    public String toString(Object obj) {

 

       if (obj == null)

           return null// 如果obj为空..返回null

       if (visited.contains(obj))

           return "..."// 如果visited中已经包含obj,返回...

 

       visited.add(obj);

 

       Class c1 = obj.getClass(); // 得到运行时对象

 

       if (c1 == String.class)

           return (String) obj; // 如果c1String类型,直接转换

 

       if (c1.isArray()) { // 如果是数组类型

           String r = c1.getComponentType() + "[]{"// 得到该数组组件类型的Class

 

           for (int i = 0; i < Array.getLength(obj); i++) {

              if (i > 0)

                  r += ",";

              Object var = Array.get(obj, i); // 取得obj[i]元素的值

              if (c1.getComponentType().isPrimitive()) // 如果为基本类型

                  r += var;

              else

                  r += toString(var); // 递归调用

           }

           return r + "}";

       }

 

       String r = c1.getName(); // 得到obj名称

 

       // 检查本类域和所有超类域

       do {

           r += "[";

           Field[] fields = c1.getDeclaredFields(); // 得到本类和超类所有域

           AccessibleObject.setAccessible(fields, true); // 将所有域设置为可访问的.

 

           for (Field field : fields) {

              if (!Modifier.isStatic(field.getModifiers())) {

                  if (!r.endsWith("["))

                     r += ",";

                  r += field.getName() + "=";

 

                  try {

                     Class type = field.getType(); // 得到字段类型

                     Object var = field.get(obj);   //设置值

                     if (type.isPrimitive())   //判断是否为基本类型

                         r += var;

                     else

                         r += toString(var);

                  } catch (Exception e) {

                     e.printStackTrace();

                  }

              }

           }

           r+="]";

           c1 = c1.getSuperclass();

       } while (c1 != null);

 

       return r;

 

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值