package beansoft; import java.beans.PropertyDescriptor; import java.util.Vector; /** * Debugger at runtime, internal used by BeanSoft. */ public class BeanDebugger { /** * 调试, 打印出给定 Bean 的所有属性的取值. * @date 2005-07-31 * @author BeanSoft * @param bean 需要调试的对象 */ public static void dump(Object bean) { java.beans.PropertyDescriptor[] descriptors = getAvailablePropertyDescriptors(bean); for(int i = 0; descriptors != null && i < descriptors.length; i++) { java.lang.reflect.Method readMethod = descriptors[i].getReadMethod(); try { Object value = readMethod.invoke(bean, null); System.out.println("[" + bean.getClass().getName() + "]." + descriptors[i].getName() + "(" + descriptors[i].getPropertyType().getName() + ") = " + value); } catch (Exception e) { // TODO auto generated try-catch e.printStackTrace(); } } } /** * 从 bean 中读取有效的属性描述符. * * NOTE: 名称为 class 的 PropertyDescriptor 被排除在外. * * @param bean * Object - 需要读取的 Bean * @return PropertyDescriptor[] - 属性列表 */ public static java.beans.PropertyDescriptor[] getAvailablePropertyDescriptors( Object bean) { try { // 从 Bean 中解析属性信息并查找相关的 write 方法 java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean .getClass()); if (info != null) { java.beans.PropertyDescriptor pd[] = info .getPropertyDescriptors(); Vector columns = new Vector(); for (int i = 0; i < pd.length; i++) { String fieldName = pd[i].getName(); if (fieldName != null && !fieldName.equals("class")) { columns.add(pd[i]); } } java.beans.PropertyDescriptor[] arrays = new java.beans.PropertyDescriptor[columns .size()]; for (int j = 0; j < columns.size(); j++) { arrays[j] = (PropertyDescriptor) columns.get(j); } return arrays; } } catch (Exception ex) { System.out.println(ex); return null; } return null; } }
因为开发过程中总是要调用一些 JavaBean 对象, 然后通过数据库操作来给这些对象赋值, 原来调试的时候是通过实现 toString() 方法, 后来发现过于麻烦, 干脆用反射机制直接写了一个工具类来自动打印出来 bean 的所有属性的名称, 类型以及当前的值, 比较方便一些.
用法: BeanDebugger.dump(myBean);
一个输出示例:
[technote.query.bean.Category].cat_desc(java.lang.String) = Cables
[technote.query.bean.Category].cat_id(int) = 19
[technote.query.bean.Category].family_desc(java.lang.String) = Accessories and Cables
[technote.query.bean.Category].family_id(int) = 1
[technote.query.bean.Category].group_id(int) = 100
[technote.query.bean.Category].subcat_desc(java.lang.String) = Accessory
[technote.query.bean.Category].subcat_id(int) = 147