博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用java反射将map映射成java对象的简易实现,模拟BeanUtils
阅读量:6866 次
发布时间:2019-06-26

本文共 4765 字,大约阅读时间需要 15 分钟。

hot3.png

在没有学到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;}@Overridepublic 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
convertors=new ArrayList
();//将所有转换器放入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
map,String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ParseException{//核心 Class clazz=Class.forName(className); Method[] methods=clazz.getMethods(); Object obj=clazz.newInstance(); Set
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
map=new HashMap
(); 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); }

 

 

 

 

 

 

转载于:https://my.oschina.net/hollowj/blog/729237

你可能感兴趣的文章
MAVLink v1.0详解——结构
查看>>
Office 365离线安装
查看>>
服务器负载暴涨以后...
查看>>
【物联网智能网关-15】WAV播放器(WinForm+WavPlay库实例)
查看>>
实战:将静态路由发布到动态路由
查看>>
linux下redmine3.3迁移、升级、插件备忘录
查看>>
Hadoop原理及部署初探
查看>>
Oracle 11g R2 常见问题处理
查看>>
windows下expdp自动备份脚本
查看>>
WPF-009:WPF窗体的拖动
查看>>
MDT2012部署系列之10 Win7镜像捕获与系统安装
查看>>
Windows 2003 AD升级至Windows 2012 AD之DHCP服务器迁移
查看>>
简单入门循环神经网络RNN:时间序列数据的首选神经网络
查看>>
SpockFS —— 基于 HTTP 的文件系统
查看>>
Java并发编程开发笔记——2线程安全性
查看>>
第三方开始菜单软件使微软 Windows 10 升级时崩溃
查看>>
产品打包工具的制作,ant,编译源码,打jar包,打tag,打war包,备份release版本等...
查看>>
SourceForge 停止在被遗弃项目捆绑第三方软件
查看>>
第六天:定义范围
查看>>
《UNIX环境高级编程(第3版)》——1.7 出错处理
查看>>