对象数据复制处理

来源:互联网 发布:匹配声音软件是什么 编辑:程序博客网 时间:2024/05/19 16:21
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.apache.commons.lang.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.log4j.Logger;/** * <p> * Title: common-util * </p> * <p> * Description: 对象数据复制处理 * </p> */public class BeanUtils {private static Logger log = Logger.getLogger(BeanUtils.class);/** * 对象数据复制 *  * @param base *            Object 数据复制源 * @param changed *            Object 数据复制目的 * @return Object 数据复制目的 */public static Object copyProperties(Object base, Object changed) {Method m = null;Method m2 = null;// Method m3 = null;Method tem = null;Map map = null;// Object te=base;// Object testit=changed;try {map = new HashMap();Class database = changed.getClass();// Class database// =Class.forName("com.gw.yxt.library.basebean.AbstractLibraryBooksort");// changed=database.newInstance();say(database.toString());Class aa = base.getClass();// Object changed=database.newInstance();Method methlist[] = aa.getDeclaredMethods();// Method methlist[] = aa.getClass().getDeclaredMethods();Method methlist2[] = database.getSuperclass().getDeclaredMethods();// Method methlist2[] = database.getClass().getDeclaredMethods();Class partypes[] = new Class[0];Class partypes2[] = new Class[1];Object arglist[] = new Object[0];Object arglist2[] = new Object[1];// java.lang.reflect.Field[] fields=database.getDeclaredFields();Class aaa = aa.getClass();say("database.getClass()" + aa.getSuperclass() + ";;"+ aaa.getSuperclass());for (int ta = 0; ta < methlist2.length; ta++) {tem = methlist2[ta];if (tem != null) {map.put(tem.getName(), tem.getName());}}say("methlist.length" + methlist.length + ";;;;;;"+ methlist2.length);TT: for (int i = 0; i < methlist.length; i++) {try {m = methlist[i];String classname = m.getName();if (classname.indexOf("get") >= 0) {m = aa.getMethod(classname, partypes);Object sstem = m.invoke(base, arglist);say("调用GET方法= " + m.getName() + ";值:=" + sstem);arglist2[0] = sstem;String temname = "s"+ classname.substring(1, classname.length());partypes2[0] = m.getReturnType();if (map.get(temname) != null&& !map.get(temname).equals("")) {say(map.get(temname) + classname);try {// m2 = aa.getMethod(temname, partypes2);m2 = database.getMethod(temname, partypes2);say(m2.getName() + "---------");// Field f=database.getField("writer");// f.set(changed,"asdf");if (arglist2[0] != null) {if (partypes2[0] == String.class)arglist2[0] = sstem.toString().trim(); // 过滤空格if (partypes2[0] == String.class&& arglist2[0].equals("")) {// Do nothing.} elsem2.invoke(changed, arglist2);say("-------------" + m2.getName() + "成功!"+ arglist2[0]);}} catch (Exception e) {// log.error("", e);continue TT;}}}} catch (NoSuchMethodException e) {// log.error("", e);}}} catch (Exception ex) {// ex.printStackTrace(); log.error("", ex);}// say("================");return changed;}public static Object invokeGetmethod(Object base, String methodname) {Method m = null;Object changed = null;try {Class aa = base.getClass();// Method methlist[] = aa.getDeclaredMethods();Class partypes[] = new Class[0];// Class partypes2[] = new Class[1];Object arglist[] = new Object[0];say("=methlist.length;database.getClass()" + aa.getSuperclass()+ ";;aa==" + aa.getName());// for (int i = 0; i < methlist.length; i++) {try {// m = methlist[i];// String classname = m.getName();// if (classname.indexOf(methodname) >= 0) {m = aa.getMethod(methodname, partypes);changed = m.invoke(base, arglist);say("111调用GET方法= " + m.getName() + ";值:=" + changed);// }} catch (NoSuchMethodException e) {// log.error("", e);}// }} catch (Exception ex) {// log.error("", ex);}return changed;}public static Object invokeSetmethod(Object base, String methodname,String value) {Method m = null;// Object changed=null;try {if (value == null || value.trim().equals(""))return base;Class aa = base.getClass();// Method methlist[] = aa.getDeclaredMethods();Class partypes[] = new Class[1];// Class partypes2[] = new Class[1];Object arglist[] = new Object[1];say("database.getClass()" + aa.getSuperclass() + ";;");// for (int i = 0; i < methlist.length; i++) {// m = methlist[i];// String classname = m.getName();// if (classname.indexOf(methodname) >= 0) {partypes[0] = String.class;m = aa.getMethod(methodname, partypes);arglist[0] = value.trim(); // 过滤空格m.invoke(base, arglist);say("-------------" + m.getName() + "成功!" + arglist[0]);// }// }} catch (Exception ex) {log.error("", ex);}return base;}// public static Object copyProperties(Object base, Object changed) {//// Method m = null;// Method m2 = null;// // Method m3 = null;// Method tem = null;// Map map = null;// //Object te=base;// // Object testit=changed;// try {// map = new HashMap();// Class database = changed.getClass();// //Class database// =Class.forName("com.gw.yxt.library.basebean.AbstractLibraryBooksort");// // changed=database.newInstance();// say(database.toString());// Class aa = base.getClass();// // Object changed=database.newInstance();// Method methlist[] = aa.getDeclaredMethods();// // Method methlist[] = aa.getClass().getDeclaredMethods();// Method methlist2[] = database.getSuperclass().getDeclaredMethods();// // Method methlist2[] = database.getClass().getDeclaredMethods();// Class partypes[] = new Class[0];// Class partypes2[] = new Class[1];// Object arglist[] = new Object[0];// Object arglist2[] = new Object[1];// // java.lang.reflect.Field[] fields=database.getDeclaredFields();// Class aaa=aa.getClass();// say("database.getClass()"+aa.getSuperclass()+";;"+aaa.getSuperclass());// for (int ta = 0; ta < methlist2.length; ta++) {// tem = methlist2[ta];// if (tem != null) {// map.put(tem.getName(), tem.getName());// }// }// say("methlist.length" + methlist.length+";;;;;;"+methlist2.length);// TT:for (int i = 0; i < methlist.length; i++) {// try {// m = methlist[i];// String classname = m.getName();// if (classname.indexOf("get") >= 0) {// m = aa.getMethod(classname, partypes);// Object sstem = m.invoke(base, arglist);// say("调用GET方法= " + m.getName()+";值:");//               // arglist2[0] = sstem;// String temname = "s" + classname.substring(1, classname.length());// partypes2[0] = m.getReturnType();//// if (map.get(temname) != null && !map.get(temname).equals("")) {// say(map.get(temname) + classname);// try {// //m2 = aa.getMethod(temname, partypes2);// m2 = database.getMethod(temname, partypes2);// say(m2.getName() + m2.getExceptionTypes() +// "---------");// //Field f=database.getField("writer");// //f.set(changed,"asdf");// if(arglist2[0]!=null){//                     // if(partypes2[0]==String.class)// arglist2[0] = sstem.toString().trim(); //过滤空格// if(partypes2[0]==String.class&&arglist2[0].equals("")){// //Do nothing.// }else// m2.invoke(changed, arglist2);// say("-------------" + m2.getName() + "成功!" +// arglist2[0]);}// }// catch (Exception e) {// //e.printStackTrace();// say("没有" + m2.getName() + m2.getParameterTypes());// continue TT;// }//                // }// }//// }// catch (NoSuchMethodException e) {// say("没有" + m.getName());// }// }//// }// catch (Exception ex) {// //ex.printStackTrace();// say("UNKNOW ERROR!");// }// // say("================");// return changed;//// }public static void say(String temp) {}public static Field getDeclaredField(Object object, String propertyName)throws NoSuchFieldException {return getDeclaredField(object.getClass(), propertyName);}/** * 类名转为属性名 *  * @param className * @return */public static String getProperty(String className) {return BeanUtils.toLowerString(className.substring(className.lastIndexOf(".") + 1, className.length()));}/** * 循环向上转型,获取对象的DeclaredField. *  * @throws NoSuchFieldException *             如果没有该Field时抛出. */public static Field getDeclaredField(Class clazz, String propertyName)throws NoSuchFieldException {for (Class superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) {try {return superClass.getDeclaredField(propertyName);} catch (NoSuchFieldException e) {// Field不在当前类定义,继续向上转型}}throw new NoSuchFieldException("No such field: " + clazz.getName()+ '.' + propertyName);}public static List<Field> getDeclaredField(Object clazz) {List<Field> list = new ArrayList<Field>();for (Class superClass = clazz.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {try {Field[] fields = superClass.getDeclaredFields();for (Field field : fields) {list.add(field);}} catch (Exception e) {}}return list;}/** * 暴力获取对象变量值,忽略private,protected修饰符的限制. *  * @throws NoSuchFieldException *             如果没有该Field时抛出. */public static Object forceGetProperty(Object object, String propertyName)throws NoSuchFieldException {Field field = getDeclaredField(object, propertyName);boolean accessible = field.isAccessible();field.setAccessible(true);Object result = null;try {result = field.get(object);} catch (IllegalAccessException e) {log.info("error wont' happen");}field.setAccessible(accessible);return result;}/** * 暴力设置对象变量值,忽略private,protected修饰符的限制. *  * @throws NoSuchFieldException *             如果没有该Field时抛出. */public static void forceSetProperty(Object object, String propertyName,Object newValue) throws NoSuchFieldException {Field field = getDeclaredField(object, propertyName);boolean accessible = field.isAccessible();field.setAccessible(true);try {field.set(object, newValue);} catch (IllegalAccessException e) {log.info("Error won't happen");}field.setAccessible(accessible);}/** * 暴力调用对象函数,忽略private,protected修饰符的限制. *  * @throws NoSuchMethodException *             如果没有该Method时抛出. */public static Object invokePrivateMethod(Object object, String methodName,Object... params) throws NoSuchMethodException {Class[] types = new Class[params.length];for (int i = 0; i < params.length; i++) {types[i] = params[i].getClass();}Class clazz = object.getClass();Method method = null;for (Class superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) {try {method = superClass.getDeclaredMethod(methodName, types);break;} catch (NoSuchMethodException e) {// 方法不在当前类定义,继续向上转型}}if (method == null)throw new NoSuchMethodException("No Such Method:"+ clazz.getSimpleName() + methodName);boolean accessible = method.isAccessible();method.setAccessible(true);Object result = null;try {result = method.invoke(object, params);} catch (Exception e) {}method.setAccessible(accessible);return result;}/** * 按Filed的类型取得Field列表. */public static List<Field> getFieldsByType(Object object, Class type) {List<Field> list = new ArrayList<Field>();Field[] fields = object.getClass().getDeclaredFields();for (Field field : fields) {if (field.getType().isAssignableFrom(type)) {list.add(field);}}return list;}/** * 按FiledName获得Field的类型. */public static Class getPropertyType(Class type, String name)throws NoSuchFieldException {return getDeclaredField(type, name).getType();}/** * 获得field的getter函数名称. */public static String getGetterName(Class type, String fieldName) {if (type.getName().equals("boolean")) {return "is" + StringUtils.capitalize(fieldName);} else {return "get" + StringUtils.capitalize(fieldName);}}/** * 获得field的getter函数,如果找不到该方法,返回null. */public static Method getGetterMethod(Class type, String fieldName) {try {return type.getMethod(getGetterName(type, fieldName));} catch (NoSuchMethodException e) {log.error(e.getMessage(), e);}return null;}public static void copyMapToBean(Object bean, Map map) throws Exception {String propirtes;// 属性名称String methodName;// 方法名称Method[] methods = bean.getClass().getDeclaredMethods();// 取出bean的所有set方法for (Method method : methods) {methodName = method.getName();if (method.getName().contains("set")&& method.getGenericParameterTypes().length > 0) {// 根据set方法取出属性名propirtes = methodName.substring(3);propirtes = toLowerString(propirtes);if (map.containsKey(propirtes) && map.get(propirtes) != null)// 如果map内包含则设置该属性{Class type = method.getParameterTypes()[0];// 取得参数类型Class value = map.get(propirtes).getClass();if (type.getName().equals(value.getName()))// 验证类型bean.getClass().getMethod(methodName, type).invoke(bean, map.get(propirtes));}}}}/** * 讲bean的属性和value全部封装成map,属性为key,value 为map *  * @param object * @return */public static Map<String, Object> getPropretiesByMap(Object object) {Map<String, Object> map = new HashMap<String, Object>();String propirtes;Field[] fields = object.getClass().getDeclaredFields();List<Field> list = new ArrayList<Field>();for (Field field : fields)list.add(field);for (Field field : list) {propirtes = field.getName();Object ro = null;try {ro = forceGetProperty(object, propirtes);// ro =// object.getClass().getMethod("get"+convertString(propirtes),// null).invoke(object, null);map.put(propirtes, ro);} catch (Exception e) {e.printStackTrace();}}return map;}/** * 讲bean的属性和value全部封装成map,属性为key,value 为map *  * @param object * @return */public static Map<String, Object> getPropretiesByMapForPersents(Object object) {Map<String, Object> map = new HashMap<String, Object>();String propirtes;/* * Field[] fields = object.getClass().getDeclaredFields(); Field[] * supperField = object.getClass().getSuperclass() * .getDeclaredFields();// 取出父类的属性 */List<Field> list = getDeclaredField(object);/* * for (Field field : fields) list.add(field); for (Field field : * supperField) list.add(field); */for (Field field : list) {propirtes = field.getName();Object ro = null;try {ro = forceGetProperty(object, propirtes);/* * ro = object.getClass().getMethod( "get" + * convertString(propirtes), null).invoke(object, null); */map.put(propirtes, ro);} catch (Exception e) {e.printStackTrace();}}return map;}/** * 字符串首字母转成大写 *  * @param str * @return */public static String convertString(String str) {String first = str.substring(0, 1);first = first.toUpperCase();return first + str.substring(1, str.length());}/** * 字符串首字母转成小写 *  * @param str * @return */public static String toLowerString(String str) {String first = str.substring(0, 1);first = first.toLowerCase();return first + str.substring(1, str.length());}/** * 动态设置javabean的properties为null *  * @param o * @param properties */public static void clearBeanProperties(Object o, String properties,Object value) {try {Field field = o.getClass().getDeclaredField(properties);Method method = o.getClass().getMethod("set" + convertString(properties), field.getType());method.invoke(o, value);} catch (Exception e) {e.printStackTrace();}}/** * 清空bean内的所有数据 *  * @param o */public static void clearBeanAllProperties(Object o) {try {// Field[] fields = o.getClass().getDeclaredFields();List<Field> fields = getDeclaredField(o);String properties = null;Object value = null;for (Field field : fields) {properties = field.getName();// value=field.getType().newInstance();if (field.getType().getName().equals("int")|| field.getType().getName().equals("long")|| field.getType().getName().equals("double")|| field.getType().getName().equals("float"))forceSetProperty(o, properties, 0);// method.invoke(o, 0);elseforceSetProperty(o, properties, null);// method.invoke(o, value);}} catch (Exception e) {e.printStackTrace();}}/** * 清空value为null的map *  * @param map * @return */public static Map removeNullValue(Map map) {Iterator<String> it = map.keySet().iterator();String key;while (it.hasNext()) {key = it.next();if (map.get(key) == null || map.get(key).equals("")) {it.remove();map.remove(key);}}return map;}/** * 实例化bean中的一个属性 *  * @param bean * @param properties * @return * @throws Exception */public static Object newProperties(Object bean, String properties)throws Exception {Field field = bean.getClass().getDeclaredField(properties);field.getName();return Class.forName(field.getName()).newInstance();}/** * 取出javabean的所有属性 *  * @param bean * @return */public static List<String> getPropertyForBean(Object bean) {List<String> list = new ArrayList<String>();Field[] fields = bean.getClass().getDeclaredFields();for (Field field : fields) {String name = field.getName();list.add(name);}return list;}/** * 查看bean内是否有该属性 *  * @param bean * @param properties * @return */public static boolean isProperties(Object bean, String properties) {for (Field field : bean.getClass().getFields()) {if (properties.equals(field.getName()))return true;}return false;}public static Object getPropertyBygetMethod(Object bean, String property)throws SecurityException, NoSuchMethodException,IllegalArgumentException, IllegalAccessException,InvocationTargetException {Object object = null;Method method = bean.getClass().getMethod("get" + convertString(property), null);object = method.invoke(bean, null);return object;}public static Object setPropertyBygetMethod(Object bean, String property,Object value) throws SecurityException, NoSuchMethodException,IllegalArgumentException, IllegalAccessException,InvocationTargetException {Object object = null;Method method = bean.getClass().getMethod("set" + convertString(property), new Class[0]);object = method.invoke(bean, value);return object;}}