一个javaBean的操作类,主要用于复制bean

今天用到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;
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值