针对JFinal中Model对象复制属性的应用场景,分享一个工具类。

针对JFinal中Model对象复制属性的应用场景,针对有BaseModel的情况。分享一个工具类。有需要的来取。源码如下:

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class BeanKit {
	
	/**
	 * 利用反射实现Model对象之间属性复制
	 * @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("rawtypes")
	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);	//构造列表对象
		}
		// 针对有BaseModel的情况
		Method[] fromMethods = from.getClass().getSuperclass().getDeclaredMethods();
		Method[] toMethods = to.getClass().getSuperclass().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(excludesList != null && excludesList.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 from
	 * @param to
	 * @param includsArray
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	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().getSuperclass().getDeclaredMethods();
		Method[] toMethods = to.getClass().getSuperclass().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;
	}

}

实际的例子:

Button button = Button.dao.findById(id);
Resource resource = new Resource();
BeanKit.copyPropertiesExclude(button, resource, new String[]{"id", "iconCls", "createTime", "createUserId", "modifyTime", "modifyUserId"});		
resource.setKind(2);
resource.setPid(menuId);
resource.setSortOrder(sequence++);
resource.setCreateUserId(createUserId);
resource.setCreateTime(new Date());
flag = resource.save();

其中:

sys_resource:

QQ图片20160927122207.png

sys_button:

QQ图片20160927122207.png

评论区

JFinal

2016-09-27 11:51

感谢分享,赞一个

vibesudi

2016-11-08 13:45

我现在没有 BaseModel 所有Model都继承了这 public abstract class Model extends com.jfinal.plugin.activerecord.Model {里面是一些sql操作的通用方法} 。然后我把BaseModel 的 get set 全放到 需要复制的Model 里了, 有问题么? 感觉好笨啊,Model 一大串,下面还有业务逻辑的方法。

热门分享

扫码入社