BeanUtils拷贝对象

本文详细介绍了Apache Commons BeanUtils库中的对象拷贝方法,包括populate用于将Map封装为JavaBean对象,copyProperties用于实现对象间属性的拷贝,以及Converter的自定义实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BeanUtils拷贝对象(浅拷贝)

拷贝的实现方法是将源bean(也可以是Map)中的每个element在转换器(Converter,官方已经提供一些默认的类型间转换器)的帮助下实现一些类型的转换,将转换的结果设置到目标bean对应的属性中,只要属性名相同就可以从源bean中拷贝值到目标bean中

1. BeanUtils.populate(Object bean,Map properties)

将请求的Map封装为bean对象(JavaBean)
常用在将form表单提交给servlet程序,对数据进行封装,封装到Person对象中
apache的javadoc中,明确指明这个方法是为解析http请求参数特别定义和使用的,在正常的使用中不推荐使用

JSP页面

<body>
<!-- 使用BeanUtils将form参数封装到 JavaBean Person对象中 -->
<!-- "/megustas/demo"为封装数据的Servlet的url -->
<form action="/megustas/demo" method="post">
    姓名 <input type="text" name="name" /> <br/>
    城市 <input type="text" name="city" /> <br/>
    爱好 <input type="text" name="hobby" /> <br/>
    年龄 <input type="text" name="age" /><br/>
    <input type="submit" value="提交" /><!-- 点击提交,提交的数据即是类中需要的属性 -->
</form>
</body>

JavaBean

public class Person {
    private String name;
    private String city;
    private String hobby;
    private int age;
    ...
 }

Servlet

public class DemoServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");// 处理乱码

        // 将form参数 自动封装 Person对象
        Person person = new Person();
        try {
            BeanUtils.populate(person, request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //检验是否封装到person对象中
        System.out.println(person.getName());
        System.out.println(person.getCity());
        System.out.println(person.getHobby());
        System.out.println(person.getAge());
        System.out.println(person.getBirthday());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

2. BeanUtils.copyProperties(Object dest, Object orig)

将orig中的成员变量的值复制给dest

实体间拷贝

User user = new User();
user.setName("张三");
user.setAge(24);
User user2 = new User();
BeanUtils.copyProperties(user2, user);
System.out.println(user2);//User [name=张三, age=24]

map和实体间的拷贝

User user3 = new User();
Map<String,Object> map = new HashMap<String, Object>();
map.put("name", "李四");
map.put("age", 12);
//把map中的元素拷贝到对象中去(不能把对象放到map中去)
BeanUtils.copyProperties(user3, map);
System.out.println(user3);//User [name=李四, age=12]

3.Converter转换器

当有需要自定义或扩展的Converter 的时候可以通过注册自定义的转换器来实现
例如Beanutil自带的DateConverter不支持String到java.util.Date的转换,通过扩展DateConverter就可以实现支持
注意:
Converter 是注册在classloader一级的,也就是说在一个class loader中同一时间只能有一个转换器起作用(BeanUtils的copyProperties和populate会依据目标bean属性的类型来决定启用那个转换器)

自定义一个转换器

public class Str2DateConverter implements Converter { 
/**
     * 将value转换成type类型的值
     * @param type 要转换成的类型
     * @parem value 被转换的值
     * @return 转换以后的结果
     */
    public Object convert(Class type, Object value) {
        if(value instanceof String){
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            String dateStr = (String) value;
            //将String解析为 指定Date格式
            Date date = null;
            try {
                date = dateFormat.parse(dateStr);
            } catch (ParseException e) {
                throw new RuntimeException("转换失败",e);
            }
            return date;
        }
        return null;
    }

注册转换器

//ConvertUtils.register(转换器, 目标类型.class),所有目标类型数据都会进行转换
String birthdayStr = "1991-01-01"; 
Person p = new Person(); 
ConvertUtils.register(new Str2DateConverter(), Date.class);
 BeanUtils.setProperty(p, "birthday", birthdayStr);
 System.out.println(p);//birthday = Tue Jan 01 00:00:00 CST 1991

使用默认转换器

package org.apache.commons.beanutils.converters

convertUtils.register(new DateConverter(), Date.class);
convertUtils.register(new BooleanConverter(null), Boolean.class);
convertUtils.register(new LongConverter(null), Long.class);
convertUtils.register(new IntegerConverter(null), Integer.class);
convertUtils.register(new DoubleConverter(null), Double.class);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值