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 }