一个经map中赋值给对象的方法。调用invoke时出现异常java.lang.IllegalArgumentException,原因是map中存储的可能都是字符串,不知道如何修改,大家帮忙看看。public Object convertMapToPojo(Map map, Class c) throws Exception {
Method[] methods = c.getMethods();
//得到传入对象的所有属性
Field[] fields = c.getDeclaredFields();
Class superClass = c.getSuperclass();
Field[] superFields = null;
if(superClass != null)
superFields = superClass.getDeclaredFields();
//创建新实例
Object o = c.newInstance();
String methodName;
String fieldName;
for(int i = 0; i < fields.length; i++) {
fieldName = fields[i].getName();
for(int j = 0; j < methods.length; j++) {
methodName = methods[j].getName().toUpperCase();
//如果方法名以get开头并包含属性名并map中没有该属性key,把属性名作为key,get方法返回值作为value插入到map中。
if(methodName.startsWith("SET") && methodName.indexOf(fieldName.toUpperCase())!=-1 && !map.containsKey(fieldName)){
Object value = map.get(fieldName.toLowerCase());
if(value != null)
methods[j].invoke(o, new Object[]{value});
}
}
}
if(superFields != null)
for(int i = 0; i < superFields.length; i++) {
fieldName = superFields[i].getName();
for(int j = 0; j < methods.length; j++) {
methodName = methods[j].getName().toUpperCase();
//如果方法名以get开头并包含属性名并map中没有该属性key,把属性名作为key,get方法返回值作为value插入到map中。
if(methodName.startsWith("SET") && methodName.indexOf(fieldName.toUpperCase())!=-1 && !map.containsKey(fieldName)){
Object value = map.get(fieldName.toLowerCase());
if(value != null)
methods[j].invoke(o, new Object[]{value});
}
}
}
return o;
}
Method[] methods = c.getMethods();
//得到传入对象的所有属性
Field[] fields = c.getDeclaredFields();
Class superClass = c.getSuperclass();
Field[] superFields = null;
if(superClass != null)
superFields = superClass.getDeclaredFields();
//创建新实例
Object o = c.newInstance();
String methodName;
String fieldName;
for(int i = 0; i < fields.length; i++) {
fieldName = fields[i].getName();
for(int j = 0; j < methods.length; j++) {
methodName = methods[j].getName().toUpperCase();
//如果方法名以get开头并包含属性名并map中没有该属性key,把属性名作为key,get方法返回值作为value插入到map中。
if(methodName.startsWith("SET") && methodName.indexOf(fieldName.toUpperCase())!=-1 && !map.containsKey(fieldName)){
Object value = map.get(fieldName.toLowerCase());
if(value != null)
methods[j].invoke(o, new Object[]{value});
}
}
}
if(superFields != null)
for(int i = 0; i < superFields.length; i++) {
fieldName = superFields[i].getName();
for(int j = 0; j < methods.length; j++) {
methodName = methods[j].getName().toUpperCase();
//如果方法名以get开头并包含属性名并map中没有该属性key,把属性名作为key,get方法返回值作为value插入到map中。
if(methodName.startsWith("SET") && methodName.indexOf(fieldName.toUpperCase())!=-1 && !map.containsKey(fieldName)){
Object value = map.get(fieldName.toLowerCase());
if(value != null)
methods[j].invoke(o, new Object[]{value});
}
}
}
return o;
}
以下是调用反射方法时对参数检查,参数对了才会调用。这样就不会抛错了。
Class m = value.getClass();
Class n = null;
Class[] cs = methods[j].getParameterTypes();
if(cs!=null&&cs.length==1){
n = cs[0];
}
if(m.equals(n)){
if (value != null)
methods[j].invoke(o, new Object[] { value });
}
如果是其实类那就要看那个类怎么转化为String,然后你再反向转换回来
如果是对象类型,那就是看那个对象类型是如何转换为String的,如果从这个String无法转换回这个对象,你只能让那个生成Map的代码改了
不过这个Map中的Value最好就已经是Integer、Double、Date之类这个的对象,你就不用烦