`
bluespring
  • 浏览: 20272 次
  • 来自: ...
社区版块
存档分类
最新评论

java reflect:打印对象内容 很好的调试工具(转载收藏)

阅读更多

备份一个有用的工具类.TypeUtil
它的typeToString(String scope, Object obj)方法,采用java的reflect机制,可以打印出任何对象的内容.
这对调试程序非常有用.
使用方法:
如果你有一个对象(比如testClassObject),想打印它的内容,可用如下方法:
System.out.println(TypeUtil.typeToString("yourClassObjectName",testClassObject));
这个方法,对调试那些对容器依赖的ejb程序很有用,特此备份.
以下为TypeUtil源程序:

java 代码
  1. /**  
  2.  * The TypeUtil class static methods for inspecting complex java types.  
  3.  * The typeToString() method is used to dump the contents of a passed object    
  4.  * of any type (or collection) to a String.  This can be very useful for debugging code that   
  5.  * manipulates complex structures.   
  6.  *   
  7.  *  
  8.  * @version $Revision : 1.2.6.4 $  
  9.  */  
  10.   
  11.   
  12. import java.util.*;   
  13. import java.lang.reflect.*;   
  14.   
  15.   
  16. public class TypeUtil {   
  17.   
  18.   
  19. /**  
  20.  * Returns a string holding the contents   
  21.  * of the passed object,  
  22.  * @param scope String  
  23.  * @param parentObject Object  
  24.  * @param visitedObjs List  
  25.  * @return String  
  26.  */  
  27.   
  28.  private static String complexTypeToString(String scope, Object parentObject,List visitedObjs) {   
  29.   
  30.   StringBuffer buffer = new StringBuffer("");   
  31.   
  32.   try {   
  33.    //   
  34.    // Ok, now we need to reflect into the object and add its child nodes...   
  35.    //   
  36.   
  37.   
  38.    Class cl = parentObject.getClass();   
  39.    while ( cl != null )  {   
  40.          
  41.     processFields(cl.getDeclaredFields(),   
  42.         scope,   
  43.         parentObject,     
  44.         buffer,    
  45.         visitedObjs );   
  46.            
  47.     cl = cl.getSuperclass();   
  48.    }   
  49.   } catch (IllegalAccessException iae) {   
  50.    buffer.append(iae.toString());   
  51.   }   
  52.      
  53.   return (buffer.toString());   
  54.  }   
  55.     
  56.  /**  
  57.   * Method processFields  
  58.   * @param fields Field[]  
  59.   * @param scope String  
  60.   * @param parentObject Object  
  61.   * @param buffer StringBuffer  
  62.   * @param visitedObjs List  
  63.   * @throws IllegalAccessException  
  64.   */  
  65.  private static void processFields( Field[] fields,    
  66.           String scope,    
  67.           Object parentObject,   
  68.           StringBuffer buffer,   
  69.           List visitedObjs ) throws IllegalAccessException {   
  70.   
  71.   for (int i = 0; i < fields.length; i++) {   
  72.   
  73.    //   
  74.    // Disregard certain fields for IDL structures   
  75.    //   
  76.    if (fields[i].getName().equals("__discriminator")   
  77.     || fields[i].getName().equals("__uninitialized")) {   
  78.     continue;   
  79.    }   
  80.       
  81.    //   
  82.    // This allows us to see non-public fields.  We might need to deal with some   
  83.    // SecurityManager issues here once it is outside of VAJ...   
  84.    //   
  85.    fields[i].setAccessible(true);   
  86.   
  87.    if (Modifier.isStatic(fields[i].getModifiers())) {   
  88.     //   
  89.     // Ignore all static members.  The classes that this dehydrator is   
  90.     // meant to handle are simple data objects, so static members have no   
  91.     // bearing....   
  92.     //   
  93.    } else {   
  94.     buffer.append(   
  95.      typeToString(scope + "." + fields[i].getName(), fields[i].get(parentObject), visitedObjs));   
  96.    }   
  97.   }   
  98.   
  99.  }   
  100.   
  101.  /**  
  102.   * Method isCollectionType  
  103.   * @param obj Object  
  104.   * @return boolean  
  105.   */  
  106.  public static boolean isCollectionType(Object obj) {   
  107.      
  108.   return( obj.getClass().isArray()||   
  109.     (obj instanceof Collection)||   
  110.     (obj instanceof Hashtable)||   
  111.     (obj instanceof HashMap)||   
  112.     (obj instanceof HashSet)||   
  113.     (obj instanceof List)||   
  114.     (obj instanceof AbstractMap )  );   
  115.  }   
  116.     
  117.  /**  
  118.   * Method isComplexType  
  119.   * @param obj Object  
  120.   * @return boolean  
  121.   */  
  122.  public static boolean isComplexType(Object obj) {   
  123.      
  124.   if ( obj instanceof Boolean ||   
  125.    obj instanceof Short ||   
  126.    obj instanceof Byte ||   
  127.    obj instanceof Integer ||   
  128.    obj instanceof Long ||   
  129.    obj instanceof Float ||   
  130.    obj instanceof Character ||   
  131.    obj instanceof Double ||   
  132.    obj instanceof String )  {   
  133.          
  134.    return false;   
  135.   }   
  136.   else {   
  137.   
  138.    Class objectClass = obj.getClass();   
  139.       
  140.    if (objectClass == boolean.class  
  141.     || objectClass == Boolean.class  
  142.     || objectClass == short.class  
  143.     || objectClass == Short.class  
  144.     || objectClass == byte.class  
  145.     || objectClass == Byte.class  
  146.     || objectClass == int.class  
  147.     || objectClass == Integer.class  
  148.     || objectClass == long.class  
  149.     || objectClass == Long.class  
  150.     || objectClass == float.class  
  151.     || objectClass == Float.class  
  152.     || objectClass == char.class  
  153.     || objectClass == Character.class  
  154.     || objectClass == double.class  
  155.     || objectClass == Double.class  
  156.     || objectClass == String.class ) {   
  157.   
  158.     return false;   
  159.   
  160.    }   
  161.       
  162.    else {    
  163.     return true;   
  164.    }   
  165.   }   
  166.  }   
  167. /**  
  168.  * Returns a string holding the contents   
  169.  * of the passed object,  
  170.  * @param scope String  
  171.  * @param obj Object  
  172.  * @param visitedObjs List  
  173.  * @return String  
  174.  */  
  175.   
  176. private static String collectionTypeToString(String scope, Object obj, List visitedObjs) {   
  177.   
  178.     StringBuffer buffer = new StringBuffer("");   
  179.   
  180.     if (obj.getClass().isArray()) {   
  181.         if (Array.getLength(obj) > 0) {   
  182.   
  183.             for (int j = 0; j < Array.getLength(obj); j++) {   
  184.   
  185.                 Object x = Array.get(obj, j);   
  186.   
  187.                 buffer.append(typeToString(scope + "[" + j + "]", x, visitedObjs));   
  188.             }   
  189.   
  190.         } else {   
  191.             buffer.append(scope + "[]: empty\n");   
  192.         }   
  193.     } else {   
  194.         boolean isCollection = (obj instanceof Collection);   
  195.         boolean isHashTable = (obj instanceof Hashtable);   
  196.         boolean isHashMap = (obj instanceof HashMap);   
  197.         boolean isHashSet = (obj instanceof HashSet);   
  198.         boolean isAbstractMap = (obj instanceof AbstractMap);   
  199.         boolean isMap = isAbstractMap || isHashMap || isHashTable;   
  200.   
  201.         if (isMap) {   
  202.             Set keySet = ((Map) obj).keySet();   
  203.             Iterator iterator = keySet.iterator();   
  204.             int size = keySet.size();   
  205.   
  206.             if (size > 0) {   
  207.   
  208.                 for (int j = 0; iterator.hasNext(); j++) {   
  209.   
  210.                     Object key = iterator.next();   
  211.                     Object x = ((Map) obj).get(key);   
  212.   
  213.                     buffer.append(typeToString(scope + "[\"" + key + "\"]", x, visitedObjs));   
  214.                 }   
  215.             } else {   
  216.                 buffer.append(scope + "[]: empty\n");   
  217.             }   
  218.         } else  
  219.             if (/*isHashTable || */  
  220.                 isCollection || isHashSet /* || isHashMap */  
  221.                 ) {   
  222.   
  223.                 Iterator iterator = null;   
  224.                 int size = 0;   
  225.   
  226.                 if (obj != null) {   
  227.   
  228.                     if (isCollection) {   
  229.                         iterator = ((Collection) obj).iterator();   
  230.                         size = ((Collection) obj).size();   
  231.                     } else  
  232.                         if (isHashTable) {   
  233.                             iterator = ((Hashtable) obj).values().iterator();   
  234.                             size = ((Hashtable) obj).size();   
  235.                         } else  
  236.                             if (isHashSet) {   
  237.                                 iterator = ((HashSet) obj).iterator();   
  238.                                 size = ((HashSet) obj).size();   
  239.                             } else  
  240.                                 if (isHashMap) {   
  241.                                     iterator = ((HashMap) obj).values().iterator();   
  242.                                     size = ((HashMap) obj).size();   
  243.                                 }   
  244.   
  245.                     if (size > 0) {   
  246.   
  247.                         for (int j = 0; iterator.hasNext(); j++) {   
  248.   
  249.                             Object x = iterator.next();   
  250.                             buffer.append(typeToString(scope + "[" + j + "]", x, visitedObjs));   
  251.                         }   
  252.                     } else {   
  253.                         buffer.append(scope + "[]: empty\n");   
  254.                     }   
  255.                 } else {   
  256.                     //   
  257.                     // theObject is null   
  258.                     buffer.append(scope + "[]: null\n");   
  259.                 }   
  260.             }   
  261.     }   
  262.   
  263.     return (buffer.toString());   
  264.   
  265. }   
  266.  /**  
  267.   * Method typeToString  
  268.   * @param scope String  
  269.   * @param obj Object  
  270.   * @param visitedObjs List  
  271.   * @return String  
  272.   */  
  273.  private static String typeToString(String scope, Object obj, List visitedObjs) {   
  274.      
  275.   if (obj == null) {   
  276.    return (scope + ": null\n");   
  277.   }   
  278.   else if (isCollectionType( obj ) ) {   
  279.    return collectionTypeToString( scope, obj, visitedObjs );   
  280.   }   
  281.   else if (isComplexType( obj ) ) {   
  282.    if( ! visitedObjs.contains(obj)) {   
  283.     visitedObjs.add(obj);     
  284.     return complexTypeToString( scope, obj, visitedObjs ) ;   
  285.    }   
  286.    else {   
  287.     return(scope + ": \n" );   
  288.    }   
  289.   }   
  290.   else {   
  291.    return ( scope + ": " + obj.toString() + "\n");   
  292.   }   
  293.  }   
  294. /**  
  295.  * The typeToString() method is used to dump the contents of a passed object    
  296.  * of any type (or collection) to a String.  This can be very useful for debugging code that   
  297.  * manipulates complex structures.   
  298.  *   
  299.  * @param scope  
  300.  * @param obj  
  301.  *  
  302.  * @return String  
  303.  *   
  304.  */  
  305.     
  306.  public static String typeToString(String scope, Object obj) {   
  307.      
  308.   if (obj == null) {   
  309.    return (scope + ": null\n");   
  310.   }   
  311.   else if (isCollectionType( obj ) ) {   
  312.    return collectionTypeToString( scope, obj, new ArrayList());   
  313.   }   
  314.   else if (isComplexType( obj ) ) {   
  315.    return complexTypeToString( scope, obj, new ArrayList() ) ;   
  316.   }   
  317.   else {   
  318.    return ( scope + ": " + obj.toString() + "\n");   
  319.   }   
  320.  }   
  321. }   
分享到:
评论
1 楼 ming500 2007-03-06  
非常好的工具。我也曾经写过了一个。当时对 数组的数据值出来太麻烦,实现的不好。
学习了。

相关推荐

    java中的反射reflect

    Java中的反射(Reflect)是Java语言的一个重要特性,它允许运行时访问类、接口、字段和方法的信息,甚至能够在运行时动态地创建对象和调用方法。反射在很多场景下都发挥着关键作用,比如在框架开发、插件系统、序列化...

    最好的java对象ToString处理方案,ToString基类

    `ToString`方法是Java中一个常用的功能,用于将对象的属性以字符串的形式展示出来,这对于调试和日志记录非常有用。在给定的`标题`中提到的"最好的java对象ToString处理方案,ToString基类"指的是一个优化的`...

    jdk1.8的src,扩展了sun.reflect,unsafe

    Java开发工具包(JDK)是Java编程语言的核心组件,提供了编写、编译、调试和运行Java应用程序所需的所有工具。在JDK 1.8版本中,开发者对`sun.reflect`和`unsafe`这两个包进行了扩展,这为高级功能和性能优化提供了...

    reflect-2.0.0.zip

    反射在许多场景下都很有用,如框架设计、元编程、插件系统、序列化以及在未知类型的情况下操作对象。 描述中的"play-base.zip,播放BasePlay框架帮助程序"提到了一个名为BasePlay的框架。Play Framework是一个开源的...

    Java jdk源码

    学习Java JDK源码能够帮助开发者更好地调试问题,优化代码,并且对软件工程有更深入的理解。 1. **Java类库**:Java JDK源码中的类库提供了大量用于输入/输出、网络通信、集合框架、多线程、异常处理等的基础功能。...

    java编码:使用掌握Java相对独立的知识点

    对于99%的内容参考,这意味着项目可能借鉴了大量已有的资源和最佳实践,是一个很好的学习和进阶的平台。在深入研究每个子模块的同时,结合相关文档和参考资料,将有助于更全面地理解和掌握Java编程的精髓。

    JAVA2 SDK 类库(PDF).rar

    2. **JDK组件**:包括Java编译器(javac)、Java虚拟机(JVM)、Java运行时环境(JRE)、Java调试器(jdb)、Java应用启动器(java)、类文件验证器(javap)等工具,它们是Java开发和运行的基础。 3. **类库详解**...

    Java1.7源码包,包含sun

    在Java 1.7中,`sun`包下有许多关键的类,比如`java.lang.reflect包`中的`sun.misc.Unsafe`,这是一个强大的工具类,允许开发者访问和修改内存,执行低级别的操作,但同时也可能导致不安全的代码。 总的来说,这个...

    xcr常用的工具类

    Java中的`java.time`包和`SimpleDateFormat`就是很好的例子,可以方便地处理日期和时间的格式化输出。 3. **网络工具类**:在网络编程中,这类工具类用于处理HTTP请求、URL解析、网络连接等任务。例如,`...

    java2 sdk 类库详解(pdf)

    Java 2 SDK,也被称为Java Development Kit (JDK),是Java编程语言的核心组成部分,它包含了开发者需要的一切工具和资源来创建、编译、调试和运行Java应用程序。这个PDF文档很可能是对Java SDK中的各种类库进行深入...

    Java反射机制-侯捷观点

    Java反射机制是Java编程语言中的一个重要特性,它赋予了程序在运行时检查和操作类、接口、字段和方法的能力。...了解和掌握反射机制,可以帮助开发者更好地利用Java的动态特性,解决复杂编程问题。

    java api源代码

    `Object`类提供了基本的方法,如`equals()`、`hashCode()`和`toString()`,这些方法在比较对象、实现哈希表和打印对象信息时经常用到。深入理解`Object`类可以帮助我们更好地实现自定义类。 2. `String`类:`String...

    21天学通Java6源代码及答案

    3. **动态代理(Dynamic Proxies)**:Java 6通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口提供了动态代理功能,可以方便地实现接口的动态代理对象,常用于AOP(面向切面编程)。...

    Java rt.jar 源码分析

    源码分析是提升Java开发者技能的重要途径,能够帮助我们理解Java内部的工作原理,优化代码,以及更好地调试和解决问题。 在这个主题“Java rt.jar 源码分析”中,我们将探讨以下几个关键知识点: 1. **Java标准库*...

    High performance Java reflection.zip

    - 访问私有成员:通过反射可以访问私有字段和方法,这在测试、调试或实现元编程时很有用。 - 动态方法调用:反射可以用于调用未知的方法,只需在运行时知道方法名和参数类型即可。 2. **反射的性能问题**: - ...

    java动态代理反射机制

    Java提供了一个内置的接口`java.lang.reflect.InvocationHandler`和一个静态工厂方法`java.lang.reflect.Proxy.newProxyInstance()`来实现动态代理。代理类在运行时生成,因此它的行为可以根据需要在运行时改变,...

    Java经典面试题+答案(带书签)pdf

    - 在Java中,字符串是以Unicode格式存储的,因此可以很好地支持多语言环境。 **3. Eclipse简便设置** - Eclipse是一个流行的Java开发工具,可以通过简单的设置来提高开发效率。例如,可以设置自动导入包、代码格式...

    jdk1.6 mac 64 zip

    Java Development Kit (JDK) 是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。标题“jdk1.6 mac 64 zip”指的是适用于Mac OS X操作系统的64位版本的JDK 1.6的zip格式安装包...

    jdk6中文api.rar

    Java Development Kit (JDK) 是Java编程语言的核心组件,它包含了一个完整的Java运行环境和一组开发工具,使得程序员能够编写、编译、调试和运行Java应用程序。JDK 6是Oracle公司发布的一个重要版本,发布于2006年,...

    jdk6x86安装后jre6

    Java开发工具包(JDK)是Java编程语言的核心组件,它包含了编译器、调试器、文档生成工具以及Java运行环境(JRE)。在给定的标题“jdk6x86安装后jre6”中,我们可以理解为用户已经成功安装了32位版本的JDK 1.6,这个...

Global site tag (gtag.js) - Google Analytics