今天用到Bean的复制..恰好有空,写了这个Bean操作类...用于Bean的复制..用到了apache的commons.BeanUtils包
代码如下,同样,如果懒的看,直接下载附件,里面包含了apache的commons.BeanUtils包
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; import java.beans.PropertyDescriptor; import java.io.*; import java.lang.reflect.InvocationTargetException; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * 一个javaBean的操作类,主要用于Bean的复制,用到了apache的commons.BeanUtils包 * * @author jreadstone * */ public final class BeansHelper { public static final String CHINESE_DATE_FORMAT = "yyyy-MM-dd"; /** * 由旧的Bean,copy数据到新的Bean中,返回新的Bean * * @param oldObj * 老的javaBean * @param newObj * 新生成的javaBean * @param propertyArray * 二维数组,如: str[0][0]=oldName ,str[0][1] = newName, str[1] 是下一对属性 * @return */ public static Object copyBeans(Object oldObj, Object newObj, String[][] propertyArray) { newObj = copyBeans(oldObj, newObj); for (int i = 0; i < propertyArray.length; i++) { for (int t = 0; t < propertyArray[i].length; t++) { if (propertyArray[i].length < 2) return newObj; if (propertyArray[i][t] == null) return newObj; } try { Object indate = PropertyUtils.getNestedProperty(oldObj, propertyArray[i][0]); if (indate instanceof java.util.Date) { indate = new java.sql.Date(((java.util.Date) indate) .getTime()); } PropertyUtils.setNestedProperty(newObj, propertyArray[i][1], indate); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } return newObj; } /** * 由旧的Bean,copy数据到新的Bean中,返回新的Bean * * @param oldObj * 旧的Bean * @param newObj * 新的Bean * @return Object 返回新的JavaBean */ public static Object copyBeans(Object oldObj, Object newObj) { PropertyDescriptor[] oldPds = PropertyUtils .getPropertyDescriptors(oldObj); PropertyDescriptor[] newPds = PropertyUtils .getPropertyDescriptors(newObj); String[] propertys = new String[250]; int ss = 0; for (int i = 0; i < oldPds.length; i++) { PropertyDescriptor oldPd = oldPds[i]; for (int t = 0; t < newPds.length; t++) { PropertyDescriptor newPd = newPds[t]; if ((oldPd.getDisplayName().equals(newPd.getDisplayName())) && (!newPd.getDisplayName().equals("class"))) { propertys[ss] = oldPd.getDisplayName(); ss = ss + 1; break; } } } for (int i = 0; i < propertys.length; i++) { if (propertys[i] == null) return newObj; try { // System.out.println(propertys[i]); // 处理日期 Object indate = PropertyUtils.getNestedProperty(oldObj, propertys[i]); if (indate instanceof java.util.Date) { indate = new java.sql.Date(((java.util.Date) indate) .getTime()); } PropertyUtils.setNestedProperty(newObj, propertys[i], indate); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } return newObj; } /** * 复制Bean属性,自动完成java.util.Date到java.sql.Date、java.util.Date到String、String到java.util.Date的类型转换 * * * @param fromBean * @param toBean */ public static void copyBeansContainsStringDate(Object fromBean, Object toBean) { try { Set fromPropertys = BeanUtils.describe(fromBean).keySet(); Set toPropertys = BeanUtils.describe(toBean).keySet(); for (Iterator iterator = fromPropertys.iterator(); iterator .hasNext();) { String propertyName = iterator.next().toString(); if (!propertyName.equals("class")) { if (toPropertys.contains(propertyName)) { Object valueToBeCopied = PropertyUtils .getNestedProperty(fromBean, propertyName); String fromDataType = PropertyUtils .getPropertyDescriptor(fromBean, propertyName) .getPropertyType().getName(); String toDataType = PropertyUtils .getPropertyDescriptor(toBean, propertyName) .getPropertyType().getName(); if (fromDataType.equals("java.util.Date") && toDataType.equals("java.sql.Date") && valueToBeCopied != null) { valueToBeCopied = new java.sql.Date( ((java.util.Date) valueToBeCopied) .getTime()); } if (fromDataType.equals("java.util.Date") && toDataType.equals("java.lang.String") && valueToBeCopied != null) { if (valueToBeCopied != null) valueToBeCopied = (new SimpleDateFormat( CHINESE_DATE_FORMAT)).format( (Date) valueToBeCopied).toString(); } if (fromDataType.equals("java.lang.String") && toDataType.equals("java.util.Date") && valueToBeCopied != null) { if (valueToBeCopied != null && !valueToBeCopied.equals("")) valueToBeCopied = (new SimpleDateFormat( CHINESE_DATE_FORMAT)) .parse((String) valueToBeCopied); } if (fromDataType.equals("double") && toDataType.equals("java.lang.String") && valueToBeCopied != null) { valueToBeCopied = new DecimalFormat( "##########0.00").format(valueToBeCopied); } PropertyUtils.setNestedProperty(toBean, propertyName, valueToBeCopied); } } } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } /** * 复制Bean属性 添加sql date到util date的转换 * * * @param fromBean * @param toBean */ public static void copyBeansContainsAll(Object fromBean, Object toBean) { try { Set fromPropertys = BeanUtils.describe(fromBean).keySet(); Set toPropertys = BeanUtils.describe(toBean).keySet(); for (Iterator iterator = fromPropertys.iterator(); iterator .hasNext();) { String propertyName = iterator.next().toString(); if (!propertyName.equals("class")) { if (toPropertys.contains(propertyName)) { Object valueToBeCopied = PropertyUtils .getNestedProperty(fromBean, propertyName); if (valueToBeCopied != null && !valueToBeCopied.equals("")) { String fromDataType = PropertyUtils .getPropertyDescriptor(fromBean, propertyName).getPropertyType() .getName(); String toDataType = PropertyUtils .getPropertyDescriptor(toBean, propertyName) .getPropertyType().getName(); if (fromDataType.equals("java.util.Date") && toDataType.equals("java.sql.Date")) { valueToBeCopied = new java.sql.Date( ((java.util.Date) valueToBeCopied) .getTime()); } if (fromDataType.equals("java.sql.Date") && toDataType.equals("java.util.Date")) { valueToBeCopied = new java.util.Date( ((java.sql.Date) valueToBeCopied) .getTime()); } if (fromDataType.equals("java.util.Date") && toDataType.equals("java.lang.String")) { valueToBeCopied = (new SimpleDateFormat( CHINESE_DATE_FORMAT)).format( (Date) valueToBeCopied).toString(); } if (fromDataType.equals("java.lang.String") && toDataType.equals("java.util.Date")) { valueToBeCopied = (new SimpleDateFormat( CHINESE_DATE_FORMAT)) .parse((String) valueToBeCopied); } if (fromDataType.equals("double") && toDataType.equals("java.lang.String")) { valueToBeCopied = new DecimalFormat( "##########0.00") .format(valueToBeCopied); } PropertyUtils.setNestedProperty(toBean, propertyName, valueToBeCopied); } } } } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } /** * 由 javaBean 信息,得到javaBean中全部信息 Bean中的Set与其它Bean不能出来 * * @param obj * 实例化的 JavaBean * @return String javaBean中全部信息 */ public static String getBeansValue(Object obj) { // String _name = "Name :="; // String _value = "Value:="; StringBuffer sb = new StringBuffer(); // sb.append("BeanInfo:=" + obj.getClass().getName()); sb.append(obj.getClass().toString().substring(6) + "=["); PropertyDescriptor[] pds = PropertyUtils.getPropertyDescriptors(obj); for (int i = 0; i < pds.length; i++) { PropertyDescriptor pd = pds[i]; try { if (pd.getDisplayName().equals("class")) continue; if (((!pd.getPropertyType().getName().equals("long"))) && ((pd.getPropertyType() != Long.class)) && ((pd.getPropertyType() != Double.class)) && ((pd.getPropertyType() != Number.class)) && ((pd.getPropertyType() != String.class)) && ((pd.getPropertyType() != Integer.class)) && ((pd.getPropertyType() != Date.class)) && ((pd.getPropertyType() != java.sql.Date.class))) continue; sb.append("'" + pd.getDisplayName()); sb.append("="); sb.append(PropertyUtils.getNestedProperty(obj, pd .getDisplayName())); sb.append("',"); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } if (sb.length() > (obj.getClass().toString().substring(6) + "=[") .length()) { sb.deleteCharAt(sb.length() - 1); } sb.append("],"); return sb.toString(); } /** * 由 javaBean 信息,得到javaBean中全部信息 Bean中的Set与其它Bean能显示出来 * * @param obj * 实例化的 JavaBean * @return String javaBean中全部信息 */ public static String getBeansValueAll(Object obj) { StringBuffer sb = new StringBuffer(); // 处理基本信息 sb.append("["); sb.append(getBeansValue(obj)); PropertyDescriptor[] pds = PropertyUtils.getPropertyDescriptors(obj); for (int i = 0; i < pds.length; i++) { PropertyDescriptor pd = pds[i]; if (pd.getDisplayName().equals("class")) continue; Object object = null; try { object = PropertyUtils.getNestedProperty(obj, pd .getDisplayName()); } catch (IllegalAccessException e) { e.printStackTrace(); // To change body of catch statement use // Options | File Templates. } catch (InvocationTargetException e) { e.printStackTrace(); // To change body of catch statement use // Options | File Templates. } catch (NoSuchMethodException e) { e.printStackTrace(); // To change body of catch statement use // Options | File Templates. } if (object == null) continue; // 处理Set 信息 if ((object.getClass() == Set.class) || (object.getClass() == HashSet.class) || (object.getClass() == TreeSet.class)) { sb.append(pd.getDisplayName() + "=["); int sbLength = sb.length(); Iterator it = ((Set) object).iterator(); while (it.hasNext()) { Object obj1 = it.next(); // sb.append("***********"); sb.append(getBeansValue(obj1)); } if (sb.length() > sbLength) { sb.deleteCharAt(sb.length() - 1); } sb.append("],"); } // 处理其它javaBean信息 if ((object.getClass() != Long.class) && (object.getClass() != Double.class) && (object.getClass() != String.class) && (object.getClass() != Float.class) && (object.getClass() != Set.class) && (object.getClass() != int.class) && (object.getClass() != HashSet.class) && (object.getClass() != Integer.class) && (object.getClass() != HashMap.class) && ((object.getClass() != Date.class)) && ((object.getClass() != java.sql.Date.class))) { // sb.append("***********"); sb.append(getBeansValue(object)); } } if (sb.length() > 1) { sb.deleteCharAt(sb.length() - 1); } sb.append("]"); return sb.toString(); } /** * javaBean对象Clone处理,这是深复制方法。(对象中的引用对象也会复制) 注意:不能进行串行化的对象一定要设成 transient * * @param ob * old对象 * @return ob 新对象 */ public static Object deepClone(Object ob) { ByteArrayOutputStream bo = new ByteArrayOutputStream(); Object newOb = null; try { ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(ob); ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); newOb = (oi.readObject()); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return newOb; } }