欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-03 13:01:16
...

备份一个有用的工具类.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. }   
相关标签: java工具