论坛首页 Java企业应用论坛

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

浏览 2421 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2007-03-06  

备份一个有用的工具类.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. }   
   发表时间:2007-03-06  
非常好的工具。我也曾经写过了一个。当时对 数组的数据值出来太麻烦,实现的不好。
学习了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics