BeanUtils.copyProperties()的用法

本文详细介绍了JavaBean属性处理中的常见问题及解决方案,重点阐述了如何利用BeanUtils简化JavaBean属性操作,通过具体示例展示了如何实现属性复制,并解决了引入包错误和多个类测试时产生的问题。

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

BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

下面通过代码来理解BeanUtils

首先创建两个类

Person.java

package com.org; import java.util.Date; public class Person { private String name; private String sex; private int age; private Date birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
Student.javapackage com.org; import java.util.Date; public class Student { private String name; private int age; private String address; private Date 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; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
测试类 BeanUtilTest.javapackage com.org; import java.lang.reflect.InvocationTargetException; import java.util.Date; //import com.sun.org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils; public class BeanUtilTest { public static void main(String[] args) { Person per = new Person(); Student stu = new Student(); per.setName("zhangsan"); per.setSex("男"); per.setAge(20); per.setBirthday(new Date()); stu.setName("wuangwu"); stu.setAddress("北京市"); try { BeanUtils.copyProperties(stu, per); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(stu.getName()); System.out.println(stu.getAge()); System.out.println(stu.getAddress()); System.out.println(stu.getBirthday()); } }
程序输出结果为:zhangsan 20 北京市 Fri Nov 25 13:03:29 CST 2011
可见Student自己设置的值都被Person给覆盖了

再做下面两个测试

把Person中的setName和setAge 改为setname setage程序输出结果为

zhangsan 20 北京市 Fri Nov 25 13:08:34 CST 2011
结果没有改变

而如果改为setNAme, setAGe结果为:

wuangwu 0 北京市 Fri Nov 25 13:10:25 CST 2011
我们发现结果改变了 内容没有被覆盖

注: 当我们加载BeanUtils类时 可能会报如下错误

Exception in thread "main" java.lang.ExceptionInInitializerError at com.org.BeanUtilTest.main(BeanUtilTest.java:101) Caused by: com.sun.org.apache.commons.logging.LogConfigurationException: com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException) (Caused by com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException)) at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543) at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235) at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209) at com.sun.org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351) at com.sun.org.apache.commons.beanutils.BeanUtils.<clinit>(BeanUtils.java:111) ... 1 more Caused by: com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException) at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:397) at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529) ... 5 more Caused by: java.lang.NullPointerException at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:374) ... 6 more
产生错误的原因是引入的包不对,应引入import org.apache.commons.beanutils.BeanUtils;

而不应是import com.sun.org.apache.commons.beanutils.BeanUtils;

另外所需jar包为:

commons-beanutils-1.8.3.jar

commons-logging-1.1.1.jar

还有一个很邪门的问题 实在令我不解

就是如果把Person,Student 测试类写在一起的话 会产生问题

类似与这样的结构

class Person{ ..... } class Student{ ..... } public class BeanUtilTest { public static void main(String[] args) { ...... } }

出现不了我们所需要的结果,郁闷中....


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值