`

一个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;
}
}

 

分享到:
评论

相关推荐

    黑马程序员-----javaBean的操作类学习笔记

    JavaBean操作类的学习是Java程序员必备的技能之一,它涉及属性设置、获取、事件处理等基本概念。以下是对JavaBean及其操作的详细解释: 1. **JavaBean规范**: - **命名规则**:通常,JavaBean的类名应该以"Bean...

    Json一键转Javabean工具

    JavaBean是Java编程中的一个概念,它是一种符合特定规范的Java类,通常用来封装业务逻辑和数据,便于对象的创建和使用。"Json一键转Javabean工具"是一个实用的开发辅助工具,它能够帮助Java开发者快速地将JSON格式的...

    javabean和xml互相转换工具类以及jar包

    下面我们将详细探讨如何实现JavaBean到XML以及XML到JavaBean的转换,并介绍一个用于此目的的工具类和相关的jar包。 首先,JavaBean是一种符合特定规范的Java类,它通常具有公共的getter和setter方法,用于封装属性...

    Dozer一个JavaBean至JavaBean映射器

    通过配置Spring的Bean,可以轻松地集成Dozer,使得对象映射成为服务层的一个透明操作。 ### 10. 示例代码 ```java DozerBeanMapper mapper = new DozerBeanMapper(); Source source = new Source(); source.set...

    xml 转Java bean工具

    这表明提供的压缩包可能包含一个图形化的XML转Java Bean工具,用户可以通过运行这两个安装程序来在本地计算机上安装和使用该工具。 总的来说,"xml 转Java bean工具"是开发过程中非常实用的辅助工具,能够帮助...

    使用javabean封装数据库操作1.rar_bean_javabean_javabean 数据库_planet7r1

    在数据库操作中,JavaBean通常用于表示数据库表的行,每个属性对应表的一列。 1. **数据库连接**:在Java中,我们通常使用JDBC(Java Database Connectivity)来建立与数据库的连接。JDBC提供了一套API,使得Java...

    javabean(DB)

    总的来说,`javabean(DB)`指的是一个与数据库操作相关的JavaBean组件,它可能包含一系列用于数据库交互的方法和属性,是Java应用中数据持久化和业务处理的关键部分。在实际项目中,我们需要根据具体需求来设计和使用...

    javabean工具类.rar

    在本资源"javabean工具类.rar"中,提供了一个工具,该工具能够根据数据库表自动生成对应的JavaBean类,这大大简化了开发过程,减少了手动编写代码的工作量。支持的数据库包括MYSQL、ORACLE和SQLSERVER,涵盖了广泛的...

    使用java类配置Bean

    1. **@Configuration**:这个注解标记在一个类上,表示该类是一个配置类,Spring会将其视为一个配置源,就像XML配置文件一样。配置类可以包含多个@Bean方法,用于定义Bean。 2. **@Bean**:这个注解标记在方法上,...

    javabean-DATABASE.rar_ java bean_java database_javabean

    Java Bean遵循一定的规范,比如它通常是公开类(public class),有一个无参数的构造函数,属性私有(private)并提供公共的getter和setter方法,以便于其他组件访问和修改其状态。此外,Java Bean还可以实现...

    根据数据库表字段自动生成javaBean工具(支持Mysql,Oracle)

    JavaBean是一种符合特定规范的Java类,它主要用于数据封装和对象持久化,是Java Web开发中的基础组件。在实际开发中,通常需要将数据库中的每一列映射到JavaBean的属性上,以便于在业务逻辑中进行数据操作。而此工具...

    Bean Validation技术实现对Javabean的校验

    2. **创建验证器**:如果需要自定义验证规则,创建一个实现`ConstraintValidator`接口的类。 3. **获取验证器实例**:通过`Validation.buildDefaultValidatorFactory().getValidator()`获取`Validator`实例。 4. **...

    javabean概念和使用

    * JavaBean 可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备。 JavaBean 的优点 * 可以将功能、处理、值、数据库访问和其他任何可以用 java 代码创造的对象进行打包,并且其他的开发者可以...

    JavaBean与JsonString的相互转换

    JavaBean是一种遵循特定规则的Java类,它主要用于封装数据,便于数据的存储和传递。JavaBean通常具有以下特点: - 是公共类(public class) - 具有默认构造函数(无参数构造器) - 属性为私有(private),并...

    jsp+javabean对数据库表的操作

    在JSP中,我们可以声明一个JavaBean实例,并通过EL(Expression Language)或JSTL(JavaServer Pages Standard Tag Library)标签来访问和操作JavaBean的属性。例如,将查询结果保存在JavaBean中: ```jsp ...

    Mysql javaBean

    例如,如果有一个`users`表,可以创建一个`UserBean`类,包含`id`、`username`、`password`等属性,并提供getter和setter方法。 4. **数据的CRUD操作**:通过DAO层,我们可以使用JavaBean进行数据库的增删改查操作...

    JAVA 版本ResultSet 转换为JAVABEAN的工具类

    这个工具类通常包含一个静态方法,接受ResultSet和JavaBean类型作为参数,然后遍历ResultSet,将数据填充到JavaBean对象中: ```java import java.sql.ResultSet; import java.sql.SQLException; public class ...

    一个javabean轻松实现对数据库的各种操作.rar_javabean_javabean 数据库_jsp

    标题中提到的“一个javabean轻松实现对数据库的各种操作”,意味着我们将创建一个Java类,它包含与数据库交互的方法,例如添加、删除、更新和查询记录。这个JavaBean通常会连接到数据库,执行SQL语句,并返回结果。 ...

    JavaBean 持久化

    JavaBean 主要用于封装数据,以及提供对这些数据的操作方法。它们可以在不同的应用程序之间共享,并且可以很容易地被集成到更复杂的应用系统中。 **2. JavaBean 持久化的意义** 持久化是指将内存中的数据转换为...

    根据json串自动生成JAVA BEAN工具

    JavaBean是Java编程中的一种设计模式,它代表一个对象,通常包含公共属性和方法,便于数据的封装和操作。在处理大量JSON数据时,手动创建对应的JavaBean类会非常耗时,因此出现了“根据json串自动生成JAVA BEAN工具...

Global site tag (gtag.js) - Google Analytics