Java 反射——把表单值映射到 model 中

回想起过往的漫漫编程人生路,不禁让人唏嘘感慨,或许这是我人生中第一次比较正规地使用反射了(/ω╲),不废话,码上见:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.nutz.lang.Strings;

/**
* @author 艾小天 
* 需要把返回的 Object 强转成一开始传进来 model 就行了
*/
public class FormUtil {
	
	private static final String STRING = "java.lang.String";//用于反射中的类型判断
	private static final String INTEGER = "java.lang.Integer";//用于反射中的类型判断
	private static final String BOOLEAN = "java.lang.Boolean";//用于反射中的类型判断
	private static final String DOMAIN = "domain.";//表单中各字段统一的前缀,ps:domain.id
	private static final String SET = "set";//用于获取 model 的 set 方法,给属性赋值

	/**
	 *
	 * @param request
	 * @param target:需要映射的 model 类
	 * @return 
	 */
	public static Object getDomainMap(HttpServletRequest request, Object target) {
		Map<String, Object> dr = new HashMap<>();
		//获取表单中所有以 domain. 开头的字段值并放到 dr 中
		Enumeration<String> e = request.getParameterNames();
		while (e.hasMoreElements()) {
			String paramName = e.nextElement();
			if(!Strings.isBlank(paramName) && paramName.startsWith(DOMAIN)) {
				dr.put(paramName.substring(7).toUpperCase(), request.getParameter(paramName));
			}
		}
		//获取 model 中所有 set** 方法
		List<Method> methodArr = getSetMethod(target.getClass().getName());
		for (Method method : methodArr) {
			String propertName = method.getName().substring(3).toUpperCase();
			//通过遍历调用所有 set 方法把值传到对应的属性中
			setParam(method, dr.get(propertName), target);
		}
		return target;
	}
	
	/**
	 * 获取 model 中所有带 set** 的方法; 
	 * @param pkgName:类的全路径名
	 * @return 
	 */
   @SuppressWarnings({ "rawtypes", "unchecked" })
   private static List<Method> getSetMethod(String pkgName) {
	   List<Method> methodArr = new ArrayList();
       try {
           Class clazz = Class.forName(pkgName);
           Method[] methods = clazz.getMethods();
           for (Method method : methods) {
               String methodName = method.getName();
               if (methodName.indexOf(SET) == 0) {
            	   methodArr.add(method);
               }
           }
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
       return methodArr;
   }
   
    /**
     * 调用 model 中的方法把值传到对应的属性上去
	 * @param method:model 的方法
	 * @param value:对应的set
	 * @param target:需要映射的 model 类
	 */
   private static void setParam(Method method, Object value, Object target) {
	   Class<?>[] parameterTypes = method.getParameterTypes();
	   //一般只有一个参数,直接取 [0] 了
	   String paramType = parameterTypes[0].getName();
	   if (!Strings.isBlank(paramType) && value != null && !"".equals(value)) {
		   try {
			   //model 对应表单中就只有这三种类型的数据,有需要再添加
			   switch (paramType) {
				   case STRING:
					   method.invoke(target, value.toString());
					   break;
					   
				   case INTEGER:
					   method.invoke(target, new Integer(value.toString()));
					   break;
					   
				   case BOOLEAN:
					   method.invoke(target, new Boolean(value.toString()));
					   break;
					   
				   default:
					   method.invoke(target, value.toString());
					   break;
			   }
		   } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
				e.printStackTrace();;
			}
	   }
   }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值