一个经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;
}

解决方案 »

  1.   

    如果你的Map中的Value都是String,那么你需要转换成那个Method中需要的类型啊你怎样生成字符串的就怎么转回来啊
      

  2.   

    如何转化参数现,从method的getParameterTypes()获得参数类型后如何转化,没有查到相关资料
      

  3.   

    我觉得你的其它程序应该保证,map里某个值的类型,就是POJO方法需要的类型。如果错了,就是往map里赋值类型错了,请检查赋值程序。
    以下是调用反射方法时对参数检查,参数对了才会调用。这样就不会抛错了。
    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 });
    }
      

  4.   

    问题是map中有什么值我无权修改,也不可能修改了。有没有办法根据参数的类型进行造型。
      

  5.   

    自己判断啊!如果是int就Integer.valueOf(str),double就Double.valueOf(str)。如果是日期就根据格式用SimpleDateFormat
    如果是其实类那就要看那个类怎么转化为String,然后你再反向转换回来
      

  6.   

    ChDw什么意思:类型不确定怎么自己判断,你要把所有的类型都都用if else判断?那要反射做什么,而且你怎么知道会有哪些类型,如果有对象类型怎么办。
      

  7.   

    还能怎样,当然是逐个类型判断啦。
    如果是对象类型,那就是看那个对象类型是如何转换为String的,如果从这个String无法转换回这个对象,你只能让那个生成Map的代码改了
    不过这个Map中的Value最好就已经是Integer、Double、Date之类这个的对象,你就不用烦
      

  8.   

    当然有意义,String与对象本身的转换有非常多可用的方案供你选择。你可以使用XMLEncoder/XMLDecoder、JSON、java.io.Serializable等等。