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