java中两个对象间的属性值复制,比较,转为map方法实现
package com.franson.study.util; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.apache.avalon.framework.service.ServiceException;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; public class BeanUtil { private static Log log = LogFactory.getLog(BeanUtil.class); /**
* 两对象之间的拷贝(在目标对象中存在的所有set方法,如果在源对象中存在对应的get方法,不管源对象的get方法的返回值是否为null,都进行拷贝)
* 仅拷贝方法名及方法返回类型完全一样的属性值
* @param desc 目标对象
* @param orig 源对象
* @param excludeFields 不拷贝的field(多个用逗号隔开)
*/
public static void copyPropertiesNotForce(Object desc, Object orig,String excludeFields) {
copyPropertiesNotForce(desc, orig, excludeFields, true);
}
/**
* 两对象之间的拷贝(在目标对象中存在的所有set方法,如果在源对象中存在对应的get方法,不管源对象的get方法的返回值是否为null,都进行拷贝)
* 仅拷贝方法名及方法返回类型完全一样的属性值
* @param desc 目标对象
* @param orig 源对象
* @param excludeFields 源对象
* @param isCopyNull 为null的属性是否拷贝(true拷贝null属性;false不拷贝null属性)
* @param excludeFields 不拷贝的field(多个用逗号隔开)
*/
public static void copyPropertiesNotForce(Object desc, Object orig,String excludeFields, boolean isCopyNull) {
Class<?> origClass = orig.getClass();
Class<?> descClass = desc.getClass(); Method[] descMethods = descClass.getMethods();
Method[] origMethods = origClass.getMethods(); boolean needExclude = false; //是否需要过滤部分字段
if(!StringUtil.isEmpty(excludeFields)){
needExclude = true;
excludeFields = "," + excludeFields.toLowerCase() + ",";
} Map<String,Method> methodMap = new HashMap<String,Method>();
for (int i = 0; i < origMethods.length; i++) {
Method method = origMethods[i];
String methodName = method.getName();
if (!methodName.equals("getClass")
&& methodName.startsWith("get")
&& (method.getParameterTypes() == null || method
.getParameterTypes().length == 0)) {
if(needExclude && excludeFields.indexOf(methodName.substring(3).toLowerCase()) > -1){
continue;
}
methodMap.put(methodName, method);
}
}
for (int i = 0; i < descMethods.length; i++) {
Method method = descMethods[i];
String methodName = method.getName();
if (!methodName.equals("getClass")
&& methodName.startsWith("get")
&& (method.getParameterTypes() == null || method
.getParameterTypes().length == 0)) {
if (methodMap.containsKey(methodName)) {
Method origMethod = (Method) methodMap.get(methodName);
try {
if (method.getReturnType().equals(
origMethod.getReturnType())) {
Object returnObj = origMethod.invoke(orig, null);
if(!isCopyNull && returnObj == null){
continue;
} String field = methodName.substring(3);
String setMethodName = "set" + field;
Method setMethod = descClass.getMethod(
setMethodName, new Class[] { method
.getReturnType() });
setMethod.invoke(desc, new Object[] { returnObj });
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
}
} /**
* 两对象之间的拷贝(在目标对象中存在的所有set方法,如果在源对象中存在对应的get方法,不管源对象的get方法的返回值是否为null,都进行拷贝)
* 仅拷贝方法名及方法返回类型完全一样的属性值
* @param desc 目标对象
* @param orig 源对象
*/
public static void copyPropertiesNotForce(Object desc, Object orig) {
copyPropertiesNotForce(desc, orig, null);
} /**
* 两对象之间的拷贝(在目标对象中存在的所有set方法,如果在源对象中存在对应的get方法,源对象的get方法的返回值为null的不拷贝)
* 仅拷贝方法名及方法返回类型完全一样的属性值
* @param desc 目标对象
* @param orig 源对象
* @param excludeFields 不拷贝的field(多个用逗号隔开)
*/
public static void copyPropertiesNotNull(Object desc, Object orig) {
copyPropertiesNotForce(desc, orig, null, false);
} public static void copyPropertiesNotNull(Object desc, Object orig,String excludeFields) {
copyPropertiesNotForce(desc, orig, excludeFields, false);
}
/**
* 判断两个对象的所有相同属性值是否相等,注意尽是比较相同的属性,对于A对象属性比B对象属性多,如果相同属性值相同,则返回为true
* @param desc
* @param orig
* @return 相等返回true,否则返回false
* @throws CrmBaseException
*/
public static boolean isEqualBeanProperties(Object desc, Object orig) throws CrmBaseException {
String result= compareBeanProperties(desc,orig);
if(result.equals("[]"))
return true;
return false;
}
/**
* 比较两个Bean相同字段的值(以源对象的值为基准,json串中显示目标对象中的值)【仅比较可转换为string的类型】
* @param desc 目标对象
* @param orig 源对象
* @return String 不一致的字段json串
* @throws ServiceException
*/
public static String compareBeanProperties(Object desc, Object orig)
throws CrmBaseException {
Map<String, Object> map = new HashMap<String, Object>();
Class<?> origClass = orig.getClass();
Class<?> descClass = desc.getClass(); Method[] descMethods = descClass.getMethods();
Method[] origMethods = origClass.getMethods(); Map<String,Method> methodMap = new HashMap<String,Method>();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < origMethods.length; i++) {
Method method = origMethods[i];
String methodName = method.getName();
if (!methodName.equals("getClass")
&& methodName.startsWith("get")
&& (method.getParameterTypes() == null || method
.getParameterTypes().length == 0)) {
methodMap.put(methodName, method);
}
}
for (int i = 0; i < descMethods.length; i++) {
Method method = descMethods[i];
String methodName = method.getName();
if (!methodName.equals("getClass")
&& methodName.startsWith("get")
&& (method.getParameterTypes() == null || method
.getParameterTypes().length == 0)) {
if (methodMap.containsKey(methodName)) {
Method origMethod = (Method) methodMap.get(methodName);
try {
if (method.getReturnType().equals(
origMethod.getReturnType())) {
Object origObj = origMethod.invoke(orig, null);
origObj = origObj == null ? "" : origObj; Method descMethod = descClass.getMethod(methodName,
null);
Object descObj = descMethod.invoke(desc, null);
descObj = descObj == null ? "" : descObj; if (!origObj.equals(descObj)) {
map.put(methodName.substring(3), descObj);
sb.append(",{'field':'");
sb.append(methodName.substring(3));
sb.append("','msg':'");
sb.append(descObj.toString().replaceAll("\'",
""));
sb.append("'}");
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
}
String str = "[";
if (sb.length() > 0) {
str += sb.substring(1);
}
return str + "]";
} /**
* bean转Map
* @param bean
* @return
*/
public static Map beanToMap(Object bean){
//return bean2Map(bean);
return objectToMap(bean);
} /**
* 通过字段名获取方法数组
* @param beanClass Class<?>
* @param fieldNameArray 要输出的所有字段名数组
* @return Method[]
*/
public static Method[] getMethods(Class<?> beanClass,String[] fieldNameArray){
Method[] methodArray = new Method[fieldNameArray.length]; String methodName;
String fieldName;
for (int i=0;i<fieldNameArray.length;i++) {
Method method = null;
fieldName = fieldNameArray[i];
methodName = fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
try {
method = beanClass.getMethod("get"+methodName, null);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
try {
method = beanClass.getMethod("is"+methodName, null);
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
}
}
methodArray[i] = method;
} return methodArray;
} private static <K, V> Map<K, V> bean2Map(Object javaBean) {
Map<K, V> ret = new HashMap<K, V>();
try {
Method[] methods = javaBean.getClass().getDeclaredMethods();
for (Method method : methods) {
if (method.getName().startsWith("get")) {
String field = method.getName();
field = field.substring(field.indexOf("get") + 3);
field = field.toLowerCase().charAt(0) + field.substring(1);
Object value = method.invoke(javaBean, (Object[]) null);
ret.put((K) field, (V) (null == value ? "" : value));
}
}
} catch (Exception e) {
}
return ret;
} public static Map objectToMap(Object o){
return objectToMap(o, "");
} private static Map objectToMap(Object o, String prefix)
{
Map ret = new HashMap();
if (o == null)
return ret;
try {
Map objDesc = PropertyUtils.describe(o); prefix = (!("".equals(prefix))) ? prefix + "." : "";
for (Iterator it = objDesc.keySet().iterator(); it.hasNext(); ) {
String key = it.next().toString();
Object val = objDesc.get(key);
if ((val != null) && (val instanceof CrmValueObject) && (!(o.equals(val))))
{
ret.putAll(objectToMap(val, prefix + key)); break;
}
ret.put(prefix + key, val);
}
} catch (Exception e) {
e.printStackTrace();
//logger.error(e);
}
//logger.debug("Object " + o + " convert to map: " + ret);
return ret;
} public static Map objectToMap(List fieldNameList, Object object)
{
Map ret = new HashMap();
for (Iterator it = fieldNameList.iterator(); it.hasNext(); ) {
String fieldName = (String)it.next();
String[] fs = fieldName.split(quote("."));
try {
Object o = object;
for (int i = 0; i < fs.length; ++i) {
Map objDesc = PropertyUtils.describe(o);
o = objDesc.get(fs[i]);
if (o == null)
break;
}
ret.put(fieldName, o);
} catch (Exception e) {
e.printStackTrace();
//logger.error(e);
}
}
return ret;
} public static String quote(String s)
{
int slashEIndex = s.indexOf("\\E");
if (slashEIndex == -1)
return "\\Q" + s + "\\E"; StringBuffer sb = new StringBuffer(s.length() * 2);
sb.append("\\Q");
slashEIndex = 0;
int current = 0;
while ((slashEIndex = s.indexOf("\\E", current)) != -1) {
sb.append(s.substring(current, slashEIndex));
current = slashEIndex + 2;
sb.append("\\E\\\\E\\Q");
}
sb.append(s.substring(current, s.length()));
sb.append("\\E");
return sb.toString();
}
}
java中两个对象间的属性值复制,比较,转为map方法实现的更多相关文章
- 【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更
java的反射实现: 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码: package com.sxd.streamTest; imp ...
- 判断java中两个对象是否相等
java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false. 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2 ...
- Java中创建实例化对象的几种方式
Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...
- java实现两台电脑间TCP协议文件传输
记录下之前所做的客户端向服务端发送文件的小项目,总结下学习到的一些方法与思路. 注:本文参考自<黑马程序员>视频. 首先明确需求,在同一局域网下的机器人A想给喜欢了很久的机器人B发送情书, ...
- [转] 有关java中两个整数的交换问题
转载申明:本文主要是用于自己学习使用,为了完善自己的只是框架,没有任何的商业目的. 原文来源:有关Java中两个整数的交换问题 如果侵权,麻烦告之,立刻删除. 在程序开发的过程,要交换两个变量的内容, ...
- Java学习笔记十四:如何定义Java中的类以及使用对象的属性
如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...
- java中的string对象深入了解
这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...
- java怎么比较两个实体类的属性值
分享一下比较两个实体类的工具包 package cn.mollie.utils; import java.beans.Introspector; import java.beans.PropertyD ...
- js中两个对象的比较
代码取自于underscore.js 1.8.3的isEqual函数. 做了一些小小的修改,主要是Function的比较修改. 自己也加了一些代码解读. <!DOCTYPE html> & ...
随机推荐
- 1.2 linear SVM 推导
1.将公式中的distance具体化 将$w_0$单独抽出作为$b$,$w=(w_1,...,w_n),x=(x_1,...,x_n)$ 则分割平面为:$w^Tx+b=0$ A.证明w为法向量 ...
- Why stackedit
马克飞象 这个小工具很不错.初初看上了他能够很好写Latex,然后能同步到Evernode.但有个问题,在ipad上面用evernote的App时,latex不能显示.可能是权限的问题. Stacke ...
- kubuntu添加windows字体
1.选取字体 在/usr/share/fonts/truetype中新建一个目录,命名为ms,然后将Windows\fonts 目录下的tahoma.ttf.tahomabd.ttf(Tahoma的粗 ...
- wx.ToolBar
wx.ToolBar A toolbar is a bar of buttons and/or other controls usually placed below the menu bar in ...
- Subsequence(暴力+二分)
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10875 Accepted: 4493 Desc ...
- 清空DateTimePicker控件的好方法
[控件ID,不要加这个方括号].Format = DateTimePickerFormat.Custom; [控件ID,不要加这个方括号].CustomFormat = " "; ...
- IIS Express中如何配置支持json
今天在使用i18next的时候,由于要加载一个json的文件,但是在vs2013中一直加载不成功呢,经过上网查资料得知原来要配置iis express才能支持json文件的加载. 文件的默认位置在:C ...
- 浅谈C++中指针和引用的区别
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个 ...
- 解决windows下Eclipse连接远程Hadoop报错
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.N ...
- js操作cookie,js判断浏览器属性,
在默认情况下,只有设置cookie的网页才能读取该cookie.如果想让一个页面读取另一个页面设置的cookie,必须设置cookie的路径. http://www.jb51.net/article/ ...