• java反射实现将HashMap中的键值对封装为一个JavaBean对象


      将HashMap中的键值对封装为一个JavaBean对象

     1 /**
     2      * 实现键值对集合中将对应的键值,赋值给目标对象的属性  
     3      * 前提:键的值必须和目标对象的属性名一致,基本数据类型必须是字符串格式!!!
     4      * 可以实现任意类型的赋值
     5      * @param map 键值对集合
     6      * @param o   要赋值的目标对象
     7      */
     8     public  static void copyValue(HashMap<String,Object> map,Object o){
     9         Class c=o.getClass();  //创建目标对象的class对象
    10         Field[] fields=c.getDeclaredFields(); //得到目标对象的所有属性
    11         for (Field f : fields) { //遍历属性集合
    12             if(map.get(f.getName())!=null){//如果属性名在集合中,有对应的键值对  进入赋值处理
    13                 String methodName="set"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);
    14                  //拼接set方法的名字
    15                 try {
    16                     Method m=c.getDeclaredMethod(methodName, f.getType());//创建set方法的method对象
    17                     Object par=map.get(f.getName()); //通过键得到值的对象  执行set方法赋值时 作为参数传递
    18                     Class typeClass=f.getType(); //得到属性的类型的class对象
    19                     if(typeClass.isPrimitive()){ //判断是否为基础数据类型 基础数据类型需要特殊处理
    20                         String p=(String)par; //所有的基本类型都可以转换为string 
    21 
    22                         if("int".equals(typeClass.getName())){ //int的包装类名字特殊 需要单独处理
    23                             par=Integer.parseInt(p);
    24                         } else if("char".equals(typeClass.getName())){//char的包装类名字特殊 需要单独处理
    25                             par=p.charAt(0); //char类型只能存储一个字符  所以直接截取
    26                         }else{
    27                             //除了int和char外 其他包装类都是基本类型名首字母大写 可以利用反射调用对应的parse方法 实现转换为基本数据类型
    28                             String className=typeClass.getName().substring(0,1).toUpperCase()+typeClass.getName().substring(1);
    29                             //将基本类型名首字母大写 拼接成包装类名
    30                             Class packageClass=Class.forName("java.lang."+className);//通过类名得到对应的包装类class对象
    31                         Method parseMethod=packageClass.getDeclaredMethod("parse"+className, String.class);//得到对应的parse方法
    32                         par= parseMethod.invoke(par, p);//调用parse方法 将字符串转换为对应的基本数据类型
    33                         }
    34                         
    35                     }else{        //如果不是基本数据类型  直接调用属性类型的class对象的cast方法 将参数直接强转为,属性类型的对象
    36                         par=typeClass.cast(par); 
    37                     }
    38 
    39                     m.invoke(o, par); //执行set方法赋值 par已经是处理完 和属性类型,对应的类型的值
    40                 
    41                 } catch (Exception e) {
    42                     // TODO Auto-generated catch block
    43                     e.printStackTrace();
    44                 } 
    45                 
    46             }
    47         }
    48         
    49     }
  • 相关阅读:
    使用Visual Studio自带工具dumpbin解析PE文件
    Python内置函数—bytearray
    .gitignore
    Git本地仓库基本操作
    推荐一款编辑神器UltraEdit
    APK文件结构
    在QQ浏览器中使用微信读书辅助工具“小悦记”插件
    Vue动画
    自定义指令的学习
    Vue过滤器的基本使用
  • 原文地址:https://www.cnblogs.com/java888/p/10383286.html
Copyright © 2020-2023  润新知