对象的复制(详细看代码)

对象的复制(详细看代码)

具体内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.lang.StringUtils;

import 请看我的上一篇博客时间工具类.DateUtil;(这个是我的上一个博客写的工具类自己导入)
/**
*
* humf
*/
public class ReflectUtil {
/**
* 对象的复制
*
* <br>
* @version 2013-9-23 下午6:45:41
* @param source 参照对象
* @param target 目标对象
*/
public static void copy(Object source, Object target) {
if(null != source || target != null){
try {
if(!(source instanceof Map) && !(source instanceof HttpServletRequest)){
ReflectUtil.beanCopy(source, target);
}else{
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields) {
// 这里是获取bean属性的类型
Class<?> beanType = field.getType();
String paraName = field.getName();

Object value = null;
if(source instanceof Map) {
value = ((Map)source).get(paraName);
} else if(source instanceof HttpServletRequest){
value = ((HttpServletRequest)source).getParameter(paraName);
}

if(null==value){
//为 null不做处理
continue;
}else if(value instanceof Map) {
value = ((Map)value).get(paraName);
} else if(value instanceof HttpServletRequest){
value = ((HttpServletRequest)value).getParameter(paraName);
}else if (beanType == java.util.Date.class) {
// 设置参数类型,此类型应该跟javaBean里边的类型一样
// 处理日期类型不匹配问题
value = DateUtil.dateStringToDate(value.toString(),"yyyy-MM-dd HH:mm:ss");
}else if (beanType == Integer.class || beanType == int.class) {
// 处理int类型不匹配问题
value = new Integer(value.toString());
}else if (beanType == Long.class || beanType == long.class) {
// 处理long类型不匹配问题
value = new Long(value.toString());
}else if (beanType == Boolean.class || beanType == boolean.class) {
// 处理boolean类型不匹配问题
value = new Boolean(value.toString());
}else if (beanType == Float.class || beanType == float.class) {
// 处理float类型不匹配问题
value = new Float(value.toString());
}else if (beanType == Double.class || beanType == double.class) {
// 处理double类型不匹配问题
value = new Double(value.toString());
}
String setMethodName = "set" + paraName.substring(0, 1).toUpperCase() + paraName.substring(1);
// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;
Method m = target.getClass().getMethod(setMethodName, beanType);
// 第二个参数是传给set方法数据
m.invoke(target, value);
}
}

} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* Bean中对象的复制
*
* @param baseForm
* 参照Bean对象
* @param objForm
* 目标Bean对象
*/
public static void beanCopy(Object baseForm, Object objForm) {
// 取得拷贝对象的所有域
Field[] fieldsBase = baseForm.getClass().getDeclaredFields();
Field.setAccessible(fieldsBase, true);
// 取得目标对象的所有域
Field[] fieldsObj = objForm.getClass().getDeclaredFields();
Field.setAccessible(fieldsObj, true);
for (int i = 0; i < fieldsObj.length; i++) {
// 取得域名称
Field fieldObj = fieldsObj[i];
for (int j = 0; j < fieldsBase.length; j++) {
Field fieldBase = fieldsBase[j];
// 比较两域名称是否一致
if (fieldObj.getName().equals(fieldBase.getName())) {
// 取得域名称并将第一个字母大小
String fieldName = fieldObj.getName();
String firstChar = fieldName.substring(0, 1).toUpperCase();
fieldName = firstChar + fieldName.substring(1);
// 取得目标对象中的set方法
Method methodObj = null;
Method methodGet = null;
// 源对象属性值
Object resultObj = null;

try {// 获得get方法
// 取得参照对象中的get方法
methodGet = baseForm.getClass().getMethod("get" + fieldName);
} catch (Exception e) {
}
if (null != methodGet) {
try {// 获得set方法并进行copy
methodObj = objForm.getClass().getMethod("set" + fieldName, new Class[] { fieldObj.getType() });
// 执行参照对象的get方法并取得返回值
resultObj = methodGet.invoke(baseForm);
// 执行目标对象的set方法并进行设值
if (null != resultObj)
methodObj.invoke(objForm, new Object[] { resultObj });
} catch (Exception e) {
}
}
break;
}
}
}
}

public static List<Object> getAllFieldAndValue(List<?> dataList) throws Exception {
List<Object> allInfoList = new ArrayList<Object>();
if (null != dataList && dataList.size() > 0) {
List<String> filedNameArr = new ArrayList<String>();
List<String> getMethodNameArr = new ArrayList<String>();
boolean flag = false;// 是否存在 serialVersionUID

Class<?> cls = dataList.get(0).getClass();// 当前类型
Field[] fs = cls.getDeclaredFields();// 当前类型的所有字段

for (int i = 0; i < fs.length; i++) {
String filedName = fs[i].getName();
if (!"serialVersionUID".equals(filedName)) {
filedNameArr.add(filedName);
String firstLetter = filedName.substring(0, 1).toUpperCase(); // 获得字段第一个字母大写
String getMethodName = "get" + firstLetter + filedName.substring(1); // 转换成字段的get方法
getMethodNameArr.add(getMethodName);
// getMethodNameArr.add(0, getMethodName) ;
} else {
flag = true;
}
}

if (flag) {
List<String> filedNameArrNew = new ArrayList<String>();
for (int i = 0; i < filedNameArr.size(); i++) {
if (null != filedNameArr.get(i)) {
filedNameArrNew.add(filedNameArr.get(i));
}
}
List<String> getMethodNameArrNew = new ArrayList<String>();
for (int i = 0; i < getMethodNameArr.size(); i++) {
if (null != getMethodNameArr.get(i)) {
getMethodNameArrNew.add(getMethodNameArr.get(i));
}
}
allInfoList.add(filedNameArrNew);
allInfoList.add(getMethodNameArrNew);

List<Object[]> allDataList = new ArrayList<Object[]>();
for (int i = 0; i < dataList.size(); i++) {
Object[] filedValueArr = new Object[getMethodNameArrNew.size()];// 当前对象所有方法对应的值
for (int j = 0; j < getMethodNameArrNew.size(); j++) {
Method getMethod = cls.getMethod(getMethodNameArrNew.get(j), new Class[] {});
Object value = getMethod.invoke(dataList.get(i), new Object[] {}); // 这个对象字段get方法的值
filedValueArr[j] = value;
}
allDataList.add(filedValueArr);
}
allInfoList.add(allDataList);
} else {
allInfoList.add(filedNameArr);
allInfoList.add(getMethodNameArr);

List<Object[]> allDataList = new ArrayList<Object[]>();
for (int i = 0; i < dataList.size(); i++) {
Object[] filedValueArr = new Object[getMethodNameArr.size()];// 当前对象所有方法对应的值
for (int j = 0; j < getMethodNameArr.size(); j++) {
Method getMethod = cls.getMethod(getMethodNameArr.get(j), new Class[] {});
Object value = getMethod.invoke(dataList.get(i), new Object[] {}); // 这个对象字段get方法的值
filedValueArr[j] = value;
}
allDataList.add(filedValueArr);
}
allInfoList.add(allDataList);
}

}
return allInfoList;
}

public static List<Object> getAllFieldAndValue2(List<?> dataList, String[] dataString) throws Exception {
try {
List<Object> allInfoList = new ArrayList<Object>();
if (null != dataList && dataList.size() > 0) {
List<String> filedNameArr = new ArrayList<String>();
List<String> getMethodNameArr = new ArrayList<String>();
boolean flag = false;// 是否存在 serialVersionUID

Class<?> cls = dataList.get(0).getClass();// 当前类型
Field[] fs = cls.getDeclaredFields();// 当前类型的所有字段

for (int i = 0; i < fs.length; i++) {
String filedName = fs[i].getName();
if (!"serialVersionUID".equals(filedName)) {
filedNameArr.add(filedName);
String firstLetter = filedName.substring(0, 1).toUpperCase(); // 获得字段第一个字母大写
String getMethodName = "get" + firstLetter + filedName.substring(1); // 转换成字段的get方法
// 判断getXX是否要显示
if (dataString != null) {
for (int j = 0; j < dataString.length; j++) {
if (getMethodName.equals(dataString[j].toString())) {
getMethodNameArr.add(getMethodName);
break;
}
}
} else {
getMethodNameArr.add(getMethodName);
}
// getMethodNameArr.add(0, getMethodName) ;
} else {
flag = true;
}
}
if (dataString != null && dataString.length > 0) {
List<String> ar = new ArrayList<String>(); // 若传入的列值不为空
// 还原为指定的顺序
for (int i = 0; i < dataString.length; i++) {
for (int j = 0; j < getMethodNameArr.size(); j++) {
if (dataString[i].equals(getMethodNameArr.get(j))) {
ar.add(dataString[i]);
}
}
}
getMethodNameArr = ar;
}

if (flag) {
List<String> filedNameArrNew = new ArrayList<String>();
for (int i = 0; i < filedNameArr.size(); i++) {
if (null != filedNameArr.get(i)) {
filedNameArrNew.add(filedNameArr.get(i));
}
}
List<String> getMethodNameArrNew = new ArrayList<String>();
for (int i = 0; i < getMethodNameArr.size(); i++) {
if (null != getMethodNameArr.get(i)) {
getMethodNameArrNew.add(getMethodNameArr.get(i));
}
}
allInfoList.add(filedNameArrNew);
allInfoList.add(getMethodNameArrNew);

List<Object[]> allDataList = new ArrayList<Object[]>();
for (int i = 0; i < dataList.size(); i++) {
Object[] filedValueArr = new Object[getMethodNameArrNew.size()];// 当前对象所有方法对应的值
for (int j = 0; j < getMethodNameArrNew.size(); j++) {
Method getMethod = cls.getMethod(getMethodNameArrNew.get(j), new Class[] {});
Object value = getMethod.invoke(dataList.get(i), new Object[] {}); // 这个对象字段get方法的值
filedValueArr[j] = value;
}
allDataList.add(filedValueArr);
}
allInfoList.add(allDataList);
} else {
allInfoList.add(filedNameArr);
allInfoList.add(getMethodNameArr);

List<Object[]> allDataList = new ArrayList<Object[]>();
for (int i = 0; i < dataList.size(); i++) {
Object[] filedValueArr = new Object[getMethodNameArr.size()];// 当前对象所有方法对应的值
for (int j = 0; j < getMethodNameArr.size(); j++) {
Method getMethod = cls.getMethod(getMethodNameArr.get(j), new Class[] {});
Object value = getMethod.invoke(dataList.get(i), new Object[] {}); // 这个对象字段get方法的值
filedValueArr[j] = value;
}
allDataList.add(filedValueArr);
}
allInfoList.add(allDataList);
}
return allInfoList;
}
} catch (Exception e) {
return null;
}
return null;
}

public static List<Object> getAllFieldAndValueObject(List<?> dataList) throws Exception {
try {
List<Object> listValue = new ArrayList<Object>();
List<Object[]> dataValueList = new ArrayList<Object[]>();
for (int i = 0; i < dataList.size(); i++) {
if(dataList.get(i) instanceof List){
List tempList = (List<String>) dataList.get(i);
int len = tempList.size();
Object[] objList = new Object[len];
for (int j = 0; j < objList.length; j++) {
objList[j] = tempList.get(j);
}
dataValueList.add(objList);
}else{
dataValueList.add((Object[])dataList.get(i));
}
}
listValue.add(null);
listValue.add(null);
listValue.add(dataValueList);
return listValue;
} catch (Exception e) {
return null;
}
}

/**
* 获得所有字段和对应的值
* Jun 20, 2012 2:41:51 PM
* @param obj
* @return Map
*/
public static Map<String, String> getAllFieldAndDataMap(Object obj) {
Map<String, String> map = new HashMap<String, String>();
return getAllFieldAndDataMap(obj, map);
}

/**
* 获得所有字段和对应的值
* Oct 25, 2012 10:28:31 PM
* @param obj
* 需要反射的对象
* @param map
* 保存数据的Map
* @return
*/
public static Map<String, String> getAllFieldAndDataMap(Object obj, Map<String, String> map) {
List<String> fnList = getAllFields(obj);
for (int i = 0; i < fnList.size(); i++) {
Object o = invokeGetterMethod(obj, fnList.get(i));
if (o instanceof String) {
map.put(fnList.get(i), (String) o);
} else if (o instanceof Date) {
map.put(fnList.get(i), DateUtil.convertDateFormat((Date) o, "yyyy-MM-dd HH:mm:ss"));
} else {
map.put(fnList.get(i), ConvertUtils.convert(o));
}
}
return map;
}

/**
* 获得当前对象的所有字段
* Jun 19, 2012 9:44:47 AM
* @param obj
* @return
*/
public static List<String> getAllFields(Object obj) {
List<String> filedNameList = new ArrayList<String>();
Class<?> cls = obj.getClass();// 当前类型
Field[] fs = cls.getDeclaredFields();// 当前类型的所有字段
for (int i = 0; i < fs.length; i++) {
String filedName = fs[i].getName();
if (!"serialVersionUID".equals(filedName)) {
filedNameList.add(filedName);
}
}
return filedNameList;
}

/**
* 调用Getter方法.
*/
public static Object invokeGetterMethod(Object target, String propertyName) {
String getterMethodName = "get" + StringUtils.capitalize(propertyName);
return invokeMethod(target, getterMethodName, new Class[] {}, new Object[] {});
}

/**
* 直接调用对象方法, 无视private/protected修饰符.
*/
public static Object invokeMethod(final Object object, final String methodName, final Class<?>[] parameterTypes, final Object[] parameters) {
Method method = getDeclaredMethod(object, methodName, parameterTypes);
if (method == null) {
throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + object + "]");
}

method.setAccessible(true);

try {
return method.invoke(object, parameters);
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
}

/**
* 循环向上转型, 获取对象的DeclaredMethod.
*
* 如向上转型到Object仍无法找到, 返回null.
*/
protected static Method getDeclaredMethod(Object object, String methodName, Class<?>[] parameterTypes) {
// Assert.notNull(object, "object不能为空");

for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
try {
return superClass.getDeclaredMethod(methodName, parameterTypes);
} catch (NoSuchMethodException e) {// NOSONAR
// Method不在当前类定义,继续向上转型
}
}
return null;
}

/**
* 将反射时的checked exception转换为unchecked exception.
*/
public static RuntimeException convertReflectionExceptionToUnchecked(Exception e) {
return convertReflectionExceptionToUnchecked(null, e);
}

public static RuntimeException convertReflectionExceptionToUnchecked(String desc, Exception e) {
desc = (desc == null) ? "Unexpected Checked Exception." : desc;
if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException || e instanceof NoSuchMethodException) {
return new IllegalArgumentException(desc, e);
} else if (e instanceof InvocationTargetException) {
return new RuntimeException(desc, ((InvocationTargetException) e).getTargetException());
} else if (e instanceof RuntimeException) {
return (RuntimeException) e;
}
return new RuntimeException(desc, e);
}

}

本作品采用知识共享署名 4.0 中国大陆许可协议进行许可,欢迎转载,但转载请注明来自御前提笔小书童,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:https://royalscholar.cn/2017/02/22/对象的复制(详细看代码)/

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×