通过反射,将map转换为java对象

来源:互联网 发布:中南大学网络教务系统 编辑:程序博客网 时间:2024/05/13 14:25
场景:

已经知道对象的类型,以及属性对应的值,且值保存在map对象中,将该map转换为已知类型的对象。

方案:如代码。



测试类:public static void main(String[] args) {Map map = new HashMap<String,Object>();map.put("name", "zhangsanfeng");map.put("sex", "男");map.put("password", "passwordInfo");try {User user = (User) Utils.mapToBean(map, User.class);System.out.println(user.getName());System.out.println(user.getPassword());System.out.println(user.getSex());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}user类:public class User {private String name;private String sex;private String password;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}} /**      * 将Map对象通过反射机制转换成Bean对象      *       * @param map 存放数据的map对象      * @param clazz 待转换的class      * @return 转换后的Bean对象      * @throws Exception 异常      */  public static Object mapToBean(Map<String, Object> map, Class<?> clazz) throws Exception {          Object obj = clazz.newInstance();          if(map != null && map.size() > 0) {              for(Map.Entry<String, Object> entry : map.entrySet()) {                  String propertyName = entry.getKey();       //属性名                Object value = entry.getValue();                  String setMethodName = "set"                          + propertyName.substring(0, 1).toUpperCase()                        + propertyName.substring(1);                  Field field = getClassField(clazz, propertyName);                  if(field==null)                continue;                Class<?> fieldTypeClass = field.getType();                  value = convertValType(value, fieldTypeClass);                 try{                clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);                 }catch(NoSuchMethodException e){                e.printStackTrace();                }            }          }          return obj;      }/**      * 获取指定字段名称查找在class中的对应的Field对象(包括查找父类)      *       * @param clazz 指定的class      * @param fieldName 字段名称      * @return Field对象      */      private static Field getClassField(Class<?> clazz, String fieldName) {          if( Object.class.getName().equals(clazz.getName())) {              return null;          }          Field []declaredFields = clazz.getDeclaredFields();          for (Field field : declaredFields) {              if (field.getName().equals(fieldName)) {                  return field;              }          }            Class<?> superClass = clazz.getSuperclass();          if(superClass != null) {// 简单的递归一下              return getClassField(superClass, fieldName);          }          return null;      }    /**      * 将Object类型的值,转换成bean对象属性里对应的类型值      *       * @param value Object对象值      * @param fieldTypeClass 属性的类型      * @return 转换后的值      */      private static Object convertValType(Object value, Class<?> fieldTypeClass) {          Object retVal = null;          if(Long.class.getName().equals(fieldTypeClass.getName())                  || long.class.getName().equals(fieldTypeClass.getName())) {              retVal = Long.parseLong(value.toString());          } else if(Integer.class.getName().equals(fieldTypeClass.getName())                  || int.class.getName().equals(fieldTypeClass.getName())) {              retVal = Integer.parseInt(value.toString());          } else if(Float.class.getName().equals(fieldTypeClass.getName())                  || float.class.getName().equals(fieldTypeClass.getName())) {              retVal = Float.parseFloat(value.toString());          } else if(Double.class.getName().equals(fieldTypeClass.getName())                  || double.class.getName().equals(fieldTypeClass.getName())) {              retVal = Double.parseDouble(value.toString());          } else {              retVal = value;          }          return retVal;      }  


1 0