`

转帖一个看起来比较有用的类-打印任意对象的内容

阅读更多

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

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

相关推荐

    转帖经典---JAVA设计模式

    2. 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 3. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 4. ...

    论坛转帖工具.rar

    标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...

    转帖--oracle分析函数+PLSQL小结

    Oracle分析函数是数据库查询中的一个强大工具,它们在处理数据集时提供了高级的聚合功能,可以对一组行进行计算,并返回单个值或一组值。分析函数与聚合函数(如SUM, AVG, COUNT等)类似,但有显著的区别:聚合函数...

    Objective-c对象组装XML

    【原创】转帖请注明来源,谢谢 -tag 1- 测试无内存泄露 1 创建数据对象() NSMutableDictionary *map = [[NSMutableDictionary alloc]init]; [map setObject:@"a" forKey:@"author"]; [map setObject:@...

    编辑人员转帖去水印工具

    它采用了先进的算法,能有效地选择并移除选定区域的水印,同时通过周围的图像内容无缝填补空白,使得修复后的图片看起来自然无痕。 使用Teorex Inpaint的步骤如下: 1. **安装与启动**:下载并安装Teorex Inpaint ...

    winform复杂表头导出打印 (转帖)

    原文转自:http://topic.csdn.net/u/20100609/08/7f5b90b1-724a-46ce-a8c7-cba778ab2e02.html 所见即所得的 打印,导出excel,复杂表头,列合并等功能,附全部源码即样例

    Html2UBBMaxcj_Softii论坛专用转帖工具

    - **内容迁移**:当需要将一个论坛的HTML帖子内容迁移到另一个只支持UBB的论坛时,Html2UBBMaxcj非常有用。 4. **压缩包内的文件**: - **Readme.txt**:通常包含软件的使用说明、注意事项或者开发者信息,对于...

    贴吧转帖工具

    它允许用户快速地将一篇帖子从一个贴吧复制并发布到另一个贴吧,无需手动复制粘贴文字和图片。这一特性对于那些希望分享有价值信息或者在多个贴吧同步维护内容的用户来说,非常实用。转帖过程中,工具通常会自动保留...

    discuz X2转帖工具、采集工具

    X2转帖工具、采集工具”是针对这个平台设计的辅助软件,主要用于帮助论坛管理员或用户批量发布帖子和采集内容,提高论坛内容更新的效率。 一、批量发帖功能 1. 自动化发布:此工具可以自动化地创建和发布帖子,...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    [转帖]世界编程大赛第一名写的程序

    标题和描述中的“世界编程大赛第一名写的程序”这一知识点,实际上指向了计算机科学与编程竞赛领域的一个重要概念:即在高水平的编程比赛中,优胜者所编写的代码往往蕴含着高级算法、数据结构以及编程技巧。...

    一键转帖功能插件 for 帝国CMS v1.0.rar

    "一键转帖功能插件 for 帝国CMS v1.0.rar" 是一个专为帝国CMS设计的扩展工具,其主要目标是简化用户在网站上分享内容的过程,提高用户体验。这个插件允许用户轻松地将网站上的文章或信息复制并转发到其他平台,如...

    2021-2022年收藏的精品资料转帖经济学资源.doc

    【标题】:“2021-2022年收藏的精品资料转帖经济学资源.doc” 【描述】:“精品教育教学资料” 这篇文档整理了2021至2022年间收集的一些高质量经济学教育资源,主要关注的是综合性的经济学研究领域。这些资料对于...

    一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0.rar

    《一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0》 本文将深入探讨“一键转帖功能插件”在帝国CMS 6.0系统中的应用与实现,该插件适用于GBK及UTF-8编码环境,旨在提升网站内容的分享与传播效率。我们将从安装...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    "转帖工具插件 for PHPwind 7.5 正式版" 是专门为 PHPwind 7.5 版本设计的一个功能插件,旨在提供便捷的帖子转移功能,帮助管理员或者用户将内容从一个地方轻松移动到另一个地方,而无需直接编辑论坛的原始文件。...

    H42131-转帖《关于用净值计算法计算收益》.doc

    H42131-转帖《关于用净值计算法计算收益》.doc

    【转帖】Extreme Presentation Method

    - **重要性**:良好的布局可以让幻灯片看起来更专业,便于受众阅读。 - **实践建议**: - 保持布局一致性,使整体风格统一。 - 合理利用空白区域,避免页面拥挤。 - 字体大小、颜色等应统一规划,增强视觉效果。 ...

    asphtml学习

    2. **IP所在地搜索**:`交流论坛--ASP编写完整的IP所在地搜索类.htm`可能包含了一个使用ASP实现的IP地址地理位置查询的代码示例,这涉及到了网络编程和第三方API的调用。 3. **JSP内部对象**:`交流论坛--JSP内部...

    轻松转帖之突破网页复制限制宣贯.pdf

    例如,用户可以创建一个名为`new_anti-disabler.user.js`的文件,放入特定的代码,以恢复被禁用的右键菜单和文本选择功能。 【火狐浏览器解除限制】 对于火狐浏览器,用户可以编写或安装UserScript(如New Anti-...

    亚信联创面试题(转帖集)

    一页纸,刚看没有多少内容,也就半张纸的试题,可仔细看起来题目还挺多。有指针和引用的区别与联系,哪个更安全?为什么?类和结构体有什么联系和区别,相互之间能不能继承?还考了整型,指针,引用的sizeof。纳闷了...

Global site tag (gtag.js) - Google Analytics