用java反射将map映射成java对象的简易实现,模拟BeanUtils

在没有学到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;
	}
<pre name="code" class="java"><span style="white-space:pre">	</span>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);
	}
}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值