用java反射将map映射成java对象的简易实现,模拟BeanUtils
2016-08-07 00:00
441 查看
在没有学到java 反射的时候 接触了Beanutils。Beanutils可以将一个表单的request.getParameterMap().直接得到一个JavaBean对象,一直都是一个个request.getParameter("xxx")的获取表单数据,实在不方便,所以接触到Beanutils之后,很好奇是如何实现的,这几天看了一下java反射,写了个简易的Beanutils,只实现了map到JavaBean的转化,开始时没有想好怎么搞,在转换器的扩展性上停了一会儿。
package hcysoul.Bean; import java.util.Date; public class Person { private String name; private int age; private String address; private Date birthday; public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + ", birthday=" + birthday + "]"; } }
package hcysoul.MyBeanUtils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set; interface Convertor{//先规定一个转换器的接口,转换器必须实现此接口 Object parse(String className) throws ParseException; } class Intconvertor implements Convertor{//int转换器 @Override public Object parse(String str) { // TODO Auto-generated method stub return Integer.parseInt(str); } public String toString(){ return int.class.toString(); } } class Doubleconvertor implements Convertor{ @Override public Object parse(String str) { // TODO Auto-generated method stub return Double.parseDouble(str); } public String toString(){ return double.class.toString(); } } class Stringconvertor implements Convertor{ @Override public Object parse(String str) { // TODO Auto-generated method stub return str.toString(); } public String toString(){ return String.class.toString(); } } class Booleanconvertor implements Convertor{ @Override public Object parse(String str) { // TODO Auto-generated method stub return Boolean.parseBoolean(str); } public String toString(){ return Boolean.class.toString(); } } class Longconvertor implements Convertor{ @Override public Object parse(String str) { // TODO Auto-generated method stub return Long.parseLong(str); } public String toString(){ return long.class.toString(); } } class Dateconvertor implements Convertor{//Date转换器不是预设转换器。用于后边测试。 @Override public Object parse(String str) throws ParseException { // TODO Auto-generated method stub SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); return sdf.parseObject(str); } public String toString(){ return Date.class.toString(); } } public class MyBeanUtils { static ArrayList<Convertor> convertors=new ArrayList<Convertor>();//将所有转换器放入list用于之后的转换器匹配匹配 static {//静态代码块中先将几个预设的转换器放进去 convertors.add(new Intconvertor()); convertors.add(new Doubleconvertor()); convertors.add(new Booleanconvertor()); convertors.add(new Longconvertor()); convertors.add(new Stringconvertor()); } public static void register(Convertor convertor){//注册就是将转换器添加到list中,用于之后匹配 convertors.add(convertor); } public static Object maptobean(Map<String,String> map,String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ParseException{//核心 Class clazz=Class.forName(className); Method[] methods=clazz.getMethods(); Object obj=clazz.newInstance(); Set<String> set=map.keySet(); for(String var:set){ for(Method method:methods){ if(("set"+Character.toUpperCase(var.charAt(0))+var.substring(1)).equals(method.getName())){//判断方法名是否相同 for(Convertor convertor:convertors){ String typename1=method.getParameterTypes()[0].toString();//因为重写了toString()方法 所以比较的是xx.class.toString() String typename2=convertor.toString(); if(typename1.equals(typename2))//匹配转换器, { method.invoke(obj, convertor.parse(map.get(var))); break; } } } } } return obj; } public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ParseException { Map<String,String> map=new HashMap<String,String>(); System.out.println(String.class.toString()); register(new Dateconvertor());//Date转换器不是预设的所以要用到先注册。 map.put("name", "hcysoul"); map.put("age", "20"); map.put("address", "hb"); map.put("birthday", "1993-09-07 17:51:53"); Object obj=maptobean(map,"hcysoul.Bean.Person"); System.out.println(obj); }
相关文章推荐
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- Java Script 用对象属性模拟map 实现去重算法
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- 使用表达式树+反射实现简易ORM对象映射操作
- 将每行映射为MAP对象的RowMapper实现
- Java 反射机制模拟hibernate实现持久化
- 模拟实现Struts拦截器-蕴含着代理模式,AOP,工厂模式,依赖注入,Java 反射,动态构造等机制
- js模拟Map对象,实现key---value
- 利用Java反射实现普通对象到JSONObject的转换
- Java中实现鼠标模拟与键盘映射
- javaScript实现类似java的Map(没有映射)
- JS 自定义对象实现Java中的Map对象功能
- java 使用反射转换对象 Object to Map
- Java数组反射实现动态的判断一个对象书否是数组,并且对数组进行拆包输出 。。
- 【分享】java反射获取、设置、打印对象属性,对象转map基础工具
- JavaScript中实现类似Java中的Map对象
- Java数组反射实现动态的判断一个对象书否是数组,并且对数组进行拆包输出 。。
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
- java利用反射机制模拟spring IOC实现