在没有学到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 ArrayListconvertors=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); }