一つのjavaBeanの操作類は主にbeanをコピーするのに使います。


今日はBeanのコピーを使いました。ちょうど暇があります。このBean操作類を書きました。Beanのコピーに使います。apacheを使ったcommon.BenUtilsパッケージコードは以下の通りです。同様に、怠け者の場合は、直接に添付ファイルをダウンロードします。中にはapacheのcommon.BeabinUtilsパッケージが含まれています。
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;
}
}