beanutils(如何实现BeanUtils.copyProperties方法的功能)

本文目录
- 如何实现BeanUtils.copyProperties方法的功能
- android-studio中怎么添加beanutils
- commons-beanutils可以干什么
- BeanUtils工具包使用异常,有加分!!!
- 如何利用 beanutils.copyproperties;更新部分
- 为什么使用BeanUtils操做属性跑出来是空值
如何实现BeanUtils.copyProperties方法的功能
第一步: BeanUtils.copyProperties()与PropertyUtils.copyProperties() 1、 通过反射将一个对象的值赋值个另外一个对象(前提是对象中属性的名字相同)。 2、 BeanUtils.copyProperties(obj1,obj2); 经常闹混不知道是谁给谁赋值,无意中先到“后
android-studio中怎么添加beanutils
如果beanutils是一个jar包,添加的步骤:
点击“app”module,然后菜单栏“Build——》Edit flavors——》Dependences”,点击右边栏的“+”,选中“Library Dependences”,最后输入“对应的jar”,导入缺失的beanutils包,最运行项目,问题解决。。。钊林IT分享
commons-beanutils可以干什么
Jakarta Commons项目提供了相当丰富的API,我们之前了解到的Commons Lang只是众多API的比较核心的一小部分而已。Commons下面还有相当数量的子项目,用于解决各种各样不同方向的实际问题,BeanUtils就是其中的一个,用于处理JavaBeans。它利用Java的反射机制,从动态的生成对bean的getter和setter的调用代码,到模拟创建一个动态的bean,等等。这个包看似简单,却是很多开源项目的基石:如在著名的Struts和Spring Framework中,我们都能找到BeanUtils的影子。大家猜猜看,有哪位名人是BeanUtils的作者之一?没错,就是Struts的创始人Craig McClanahan。
BeanUtils最核心的好处在于:我们在编码时,并不需要知道我们处理的JavaBeans具体是什么类型,有哪些属性,这些信息是可以动态获取的,甚至我们都可以不必去关心事实上是否存在这样一个具体的JavaBean类。我们只需要知道有一个JavaBean的实例,我们需要从中取得某个属性,设定某个属性的值,或者仅仅是需要一个属性表。要做到这些,依靠Sun提供的JavaBean规范似乎找不到一个很直接的方式,除非硬编码,将getXxxx()和setXxxx()直接写进我们的程序。但是这样就大大增加了代码的复杂度、耦合性和维护成本。
BeanUtils工具包使用异常,有加分!!!
package com.cxf.custom;
public class Student {
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;
}
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
刚才那个引用错包问题晚了一步,这次不能晚了,把这个Student替换你的就OK了
这是运行结果:CaoChegn
如何利用 beanutils.copyproperties;更新部分
spring和apache commons-beanutils中分别存在一个BeanUtils,提供了对java bean的常用操作。
之前在写程序时,用到了两个不同类型但属性基本相同的对象的拷贝,结果在拷贝java.util.Date类型的对象属性时,由于其值为null,而抛异常。
由于时间紧急,所以临时改成了get/set方式,幸亏对象的属性不算多。
后来一直耿耿于怀这个问题,今天抽空看了一下spring和apache commons-beanutils包中BeanUtils.copyProperties的实现。
spring中实现的方式很简单,就是对两个对象中相同名字的属性进行简单get/set,仅检查属性的可访问性。
而commons-beanutils则施加了很多的检验,包括类型的转换,甚至于还会检验对象所属的类的可访问性。
而且,commons-beanutils中的装换是不支持java.util.Date的。除了支持基本类型以及基本类型的数组之外,还支持java.sql.Date, java.sql.Time, java.sql.TimeStamp, java.io.File, javaio.URL这些类的对象,其余一概不支持。不过你可以自定义你的类的Converter。然后注册进去。
感觉commons-beanutils包中的这个BeanUtils类的copyProperties方法,太过复杂,约束太多,而且使用不便,虽然可扩展性好了,但是易用性不高。
总结:
关于bean复制,如果属性较少,建议直接写个方法完成get/set即可。如果属性较多,可以自己采用反射实现一个满足自己需要的工具类,或者使用spring的那个beanutils类,不建议使用commons-beanutils包中的那个BeanUtils类,刚看了下,这个类对于内部静态类的对象复制也会出现问题,检验太复杂了,常会出现一些诡异的问题。毕竟我们bean复制一般就是简单的属性copy而已。
而且,由于这些BeanUtils类都是采用反射机制实现的,对程序的效率也会有影响。因此,慎用BeanUtils.copyProperties!!!
为什么使用BeanUtils操做属性跑出来是空值
package
com.wzh.test.beanutils;
import
java.lang.reflect.InvocationTargetException;
import
java.text.ParseException;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.HashMap;
import
java.util.Map;
import
org.apache.commons.beanutils.BeanUtils;
import
org.apache.commons.beanutils.ConversionException;
import
org.apache.commons.beanutils.ConvertUtils;
import
org.apache.commons.beanutils.Converter;
import
org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import
org.junit.Test;
//
使用
BeanUtils
操作
Bean
属性(第三方)
public
class
Demo1 {
@Test
public
void
test1() throws
IllegalAccessException,
InvocationTargetException {
Person p = new
Person();
BeanUtils.setProperty(p, “name“, “victor“);
System.out.println(p.getName());
}
@Test
public
void
test2() throws
IllegalAccessException,
InvocationTargetException {
Person p = new
Person();
//
自动将
String
转为
int
支持
8
种基本数据类型
BeanUtils.setProperty(p, “age“, “23“);
//
默认不支持时间转换
BeanUtils.setProperty(p, “Birthday“, “2012-3-1“);
System.out.println(p.getAge());
System.out.println(p.getBirthday());
}
@Test
public
void
test3() throws
IllegalAccessException,
InvocationTargetException {
//
为了让日期赋到
Bean
的
Birthday
属性上,我们给
BeanUtils
注册一个日期转换器
(
敲入代码未起作用,
需检查
)
//
方法
1.
ConvertUtils.register(new
Converter() {
@Override
public
Object convert(Class type, Object value) {
if
(value == null)
return
null;
if
(!(value instanceof
String)) {
System.out.println(“
不是日期类型
“);
throw
new
ConversionException(“
不是日期类型
“);
}
String str = (String) value;
if
(str.trim().equals(str)) {
return
null;
}
SimpleDateFormat df = new
SimpleDateFormat(“yyyy-MM-dd“);

更多文章:
another time(another time和other time的区别)
2026年10月11日 05:00







