这个错误主要时类型出现错误:
m.invoke(t, va); 造成的错误
va 为String类型的数值
如果有一个方法需要的参数是Double就会出现该错误
private <T> T parseRequest(HttpServletRequest request, Class<T> cls) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// 获取对象
T t = cls.newInstance();
List<Method> setMethods = getAllSetMethods(cls);
Map<String, String[]> map = request.getParameterMap();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
String key = entry.getKey();
String[] value = entry.getValue();
String setKey = "set" + key;
String va = "";
if (value.length > 0 && value != null) {
va = value[0];
}
if (va == "") {
continue;
}
for (Method m : setMethods) {
//如果键相同 则给该方法赋值
if (m.getName().equalsIgnoreCase(setKey)) {
m.invoke(t, va);
}
}
}
return t;
}
private List<Method> getAllSetMethods(Class cls) {
List<Method> setMethods = new ArrayList<>();
Method methods[] = cls.getDeclaredMethods();
for (Method m : methods) {
if (m.getName().startsWith("set")) {
setMethods.add(m);
}
}
return setMethods;
}
进行改良
先判断类型再进行赋值
private <T> T parseRequest(HttpServletRequest request, Class<T> cls) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// 获取对象
T t = cls.newInstance();
List<Method> setMethods = getAllSetMethods(cls);
Map<String, String[]> map = request.getParameterMap();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
String key = entry.getKey();
String[] value = entry.getValue();
String setKey = "set" + key;
String va = "";
if (value.length > 0 && value != null) {
va = value[0];
}
if (va == "") {
continue;
}
for (Method m : setMethods) {
//如果键相同 则给该方法赋值
if (m.getName().equalsIgnoreCase(setKey)) {
String parameterName=m.getParameterTypes()[0].getName();
if("int".equals(parameterName)&&"java.lang.Integer".equals(parameterName) ){
int v = Integer.parseInt(va);
m.invoke(t, v);
}else if("float".equals(parameterName)||"java.lang.Float".equals(parameterName)){
float v = Float.parseFloat(va);
m.invoke(t, v);
}else if("double".equals(parameterName)||"java.lang.Double".equals(parameterName)){
Double v = Double.parseDouble(va);
m.invoke(t, v);
}else{
m.invoke(t, va);
}
}
}
}
return t;
}
private List<Method> getAllSetMethods(Class cls) {
List<Method> setMethods = new ArrayList<>();
Method methods[] = cls.getDeclaredMethods();
for (Method m : methods) {
if (m.getName().startsWith("set")) {
setMethods.add(m);
}
}
return setMethods;
}