做了好久的java開發 ,卻一直沒有詳細了解java反射機制,后來寫項目的時候發現用反射可以少寫好多無聊的代碼,因此用java反射簡單實現注入。
java反射的具體細節可參見 這篇博客寫的非常詳細,點此進入~
而一般基於業務的編程主要用反射實現將屬性動態的注入一個對象中。
以下是方法實現:
1 /** 2 * 根據 傳入的map與類名,通過反射實例化對象 3 * @param className 需要實例化的類名 4 * @param map 包含屬性的鍵值對 (String,Object) 5 * @return 實例化成功的對象 6 */ 7 public static Object map2Bean(String className,Map<String,Object> map){ 8 Object obj=null; 9 try { 10 //根據類名實例化對象 11 obj=Class.forName(className).newInstance(); 12 13 for(String key :map.keySet()){ 14 if(key!=null&&!"".equals(key)){ 15 16 //將屬性首字符大寫 17 Character c=key.charAt(0); 18 c=Character.toUpperCase(c); 19 String temp=String.valueOf(c); 20 if(key.length()>1) 21 temp+=key.substring(1); 22 23 Method methods[]=obj.getClass().getMethods(); 24 for(int i=0;i<methods.length;++i){ 25 //判斷方法名是否匹配 26 if(methods[i].getName().contains("set"+temp)) 27 { 28 //執行方法,傳入值 29 methods[i].invoke(obj, map.get(key)); 30 break; 31 } 32 } 33 } 34 } 35 // Method method=obj.getClass().getMethod("toString"); 36 // method.invoke(obj, null); 37 } catch (InstantiationException e) { 38 39 e.printStackTrace(); 40 } catch (IllegalAccessException e) { 41 42 e.printStackTrace(); 43 } catch (SecurityException e) { 44 45 e.printStackTrace(); 46 } catch (IllegalArgumentException e) { 47 48 e.printStackTrace(); 49 } catch (InvocationTargetException e) { 50 51 e.printStackTrace(); 52 } catch (ClassNotFoundException e) { 53 54 e.printStackTrace(); 55 } 56 return obj; 57 58 }
接下來是調用~
public static void main(String[] args) { //傳入參數 Map<String,Object> map=new HashMap<String, Object>(); map.put("id", 1); map.put("name", "lz"); map.put("age", 20); map.put("email", "qq@qq.com"); map.put("qq", "100000"); map.put("address", "tj"); Person person=(Person) map2Bean(Person.class.getName(),map); person.toString(); }