对象数据复制处理

17 篇文章 0 订阅
13 篇文章 0 订阅
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.
									} else
										m2.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);
				else
					forceSetProperty(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;
	}
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值