标签:
做了好久的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(); }
标签:
原文地址:http://www.cnblogs.com/shibalang/p/4781989.html