做项目时经常遇到 输出参数时值相变了?相互影响了 ?
java对象之间都是地址传递 所以要将对象值赋值过去 用BeanUtils里的对象复制工具BeanUtils.copyProperties(u, u1);
List<MlklUser> count1List = new ArrayList<MlklUser>();
List<MlklUser> count2List = new ArrayList<MlklUser>();
List<MlklUser> regDateList = new ArrayList<MlklUser>();
List<MlklUser> regOrderList = new ArrayList<MlklUser>();
List<MlklUser> regNoOrderList = new ArrayList<MlklUser>();
for (MlklUser u : list) {
MlklUser u1 = new MlklUser();
BeanUtils.copyProperties(u, u1);
if (u.getParent().getId().equals(user.getpIds())) {
count1++;
count1List.add(u);
} else if (u.getpIds().split(",").length == 3 && u.getpIds().split(",")[0].equals(user.getpIds())) {
count3++;
} else {
count2List.add(u);
}
(1)在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2)在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。
Android中Jdk被精简 会找不到一下复制工具类:
package com.samsung.galaxy.utils; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.util.List; public class BeanPropertiesUtil { /** * 利用反射实现对象之间属性复制 * @param from * @param to */ public static void copyProperties(Object from, Object to) throws Exception { copyPropertiesExclude(from, to, null); } /** * 复制对象属性 * @param from * @param to * @param excludsArray 排除属性列表 * @throws Exception */ @SuppressWarnings("unchecked") public static void copyPropertiesExclude(Object from, Object to, String[] excludsArray) throws Exception { List<String> excludesList = null; if(excludsArray != null && excludsArray.length > 0) { excludesList = Arrays.asList(excludsArray); //构造列表对象 } Method[] fromMethods = from.getClass().getDeclaredMethods(); Method[] toMethods = to.getClass().getDeclaredMethods(); Method fromMethod = null, toMethod = null; String fromMethodName = null, toMethodName = null; for (int i = 0; i < fromMethods.length; i++) { fromMethod = fromMethods[i]; fromMethodName = fromMethod.getName(); if (!fromMethodName.contains("get") || fromMethodName.contains("getId")) continue; //排除列表检测 if(excludesList != null && excludesList.contains(fromMethodName.substring(3).toLowerCase())) { continue; } toMethodName = "set" + fromMethodName.substring(3); toMethod = findMethodByName(toMethods, toMethodName); if (toMethod == null) continue; Object value = fromMethod.invoke(from, new Object[0]); if(value == null) continue; //集合类判空处理 if(value instanceof Collection) { Collection newValue = (Collection)value; if(newValue.size() <= 0) continue; } toMethod.invoke(to, new Object[] {value}); } } /** * 对象属性值复制,仅复制指定名称的属性值 * @param from * @param to * @param includsArray * @throws Exception */ @SuppressWarnings("unchecked") public static void copyPropertiesInclude(Object from, Object to, String[] includsArray) throws Exception { List<String> includesList = null; if(includsArray != null && includsArray.length > 0) { includesList = Arrays.asList(includsArray); //构造列表对象 } else { return; } Method[] fromMethods = from.getClass().getDeclaredMethods(); Method[] toMethods = to.getClass().getDeclaredMethods(); Method fromMethod = null, toMethod = null; String fromMethodName = null, toMethodName = null; for (int i = 0; i < fromMethods.length; i++) { fromMethod = fromMethods[i]; fromMethodName = fromMethod.getName(); if (!fromMethodName.contains("get")) continue; //排除列表检测 String str = fromMethodName.substring(3); if(!includesList.contains(str.substring(0,1).toLowerCase() + str.substring(1))) { continue; } toMethodName = "set" + fromMethodName.substring(3); toMethod = findMethodByName(toMethods, toMethodName); if (toMethod == null) continue; Object value = fromMethod.invoke(from, new Object[0]); if(value == null) continue; //集合类判空处理 if(value instanceof Collection) { Collection newValue = (Collection)value; if(newValue.size() <= 0) continue; } toMethod.invoke(to, new Object[] {value}); } } /** * 从方法数组中获取指定名称的方法 * * @param methods * @param name * @return */ public static Method findMethodByName(Method[] methods, String name) { for (int j = 0; j < methods.length; j++) { if (methods[j].getName().equals(name)) return methods[j]; } return null; } }