您的位置:首页 > 编程语言 > Java开发

用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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: