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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM