Java BeanUtils使用方法详解
介绍
BeanUtils工具类是方便我们对JavaBean进行操作的工具,在java开发中很实用,比如属性拷贝,简化了操作,提高了开发效率,下面就来详细了解一下吧!!!
BeanUtils对JavaBean的常用操作
1. BeanUtils可以对javaBean的属性进行赋值。
2. BeanUtils可以将一个MAP集合的数据拷贝到一个javabean对象中。
3. BeanUtils可以对javaBean的对象进行赋值。
BeanUtils使用步骤
步骤一:项目中导入commons-beanutils.jar包
步骤二:在项目中就可以使用对javaBean的一些相关操作,比如:
1).给对象赋值:BeanUtils.setProperty(对象,属性名,属性值);
2).把一个javaBean的属性拷贝到另一个javaBean对象中:BeanUtils.copyProperties(源对象,新对象);
...
BeanUtils常用方法
常用方法 描述
copyProperties(Objectdest,Objectorig) 对象拷贝
copyProperty(Objectbean,Stringname,Objectvalue) 指定属性拷贝到指定的对象中
cloneBean(Objectbean) 对象的克隆
populate(Objectbean,Map
setProperty(Objectbean,Stringname,Objectvalue) 设置指定属性的值
案例
1.创建一个学生实体类(Student.java) publicclassStudent{
privateStringname;
privateintage;
privateStringse;
publicStudent(){
}
get和set省略
}
2.测试BeanUtils的常见用法
@Test
publicvoidBeanUtilsTest()throwsEception{
Map
map.put("name","张三");
map.put("age",12);
map.put("se","男");
//将map数据拷贝到Student中
Studentstu=newStudent();
BeanUtils.populate(stu,map);
//Student[name=张三,age=12,se=男]
System.out.println(stu);
//对象的拷贝
Studentstu1=newStudent();
BeanUtils.copyProperties(stu,stu1);
//Student[name=张三,age=12,se=男]
System.out.println(stu1);
//拷贝指定的属性
Studentstu2=newStudent();
BeanUtils.copyProperty(stu2,"name","李四"); //Student[name=李四,age=0,se=null]
System.out.println(stu2);//设置指定的属性
BeanUtils.setProperty(stu2,"se","女");
//Student[name=李四,age=0,se=女]
System.out.println((stu2);
//克隆对象
Objectobject=BeanUtils.cloneBean(stu2);
//Animal[name=李四,age=0,se=女]
System.out.println(object);
}
注意事项:BeanUtils在进行数据拷贝中,不管数据是否有值,会直接覆盖,这样就会存在有些需求无法满足的情况,不如说当拷贝的值为null时,不允许覆盖,可以进行如下操作:
publicstaticString[]getNullPropertyNames(Objectsource){
finalBeanWrappersrc=newBeanWrapperImpl(source);
java.beans.PropertyDescriptor[]pds=src.getPropertyDescriptors();
Set
for(java.beans.PropertyDescriptorpd:pds){
ObjectsrcValue=src.getPropertyValue(pd.getName());
if(srcValue==null)emptyNames.add(pd.getName());
}
String[]result=newString[emptyNames.size()];
returnemptyNames.toArray(result);
}
BeanUtils.copyProperties(源对象,新对象,getNullPropertyNames(源对象));
beanutil.beantomap原理
beanutil.beantomap原理
在Java中,mons.beanutils.BeanUtils类中的BeanUtils.toMap方法用于将JavaBean对象转换为java.util.Map。这个方法的原理主要是通过反射来获取JavaBean的属性和对应的值,然后将这些属性和值存储在一个Map中。
下面是BeanUtils.toMap方法的简单实例:
import mons.beanutils.BeanUtils;
public class BeanToMapExample {
public static void main(String[] args) throws Exception {
// 创建一个示例JavaBean对象
Person person = new Person("John Doe", 25);
// 使用BeanUtils.toMap方法将JavaBean转换为Map
java.util.Map map =
BeanUtils.describe(person);
// 输出转换后的Map
System.out.println(map);
}
} 在这个例子中,Person类是一个简单的JavaBean类,具有两个属性:name和age。BeanUtils.describe方法通过反射获取这个JavaBean的属性和对应的值,然后将其放入一个Map中,其中键是属性名,值是属性对应的值。
需要注意的是,BeanUtils.describe方法返回的Map中的值都是字符串类型,因为在JavaBean中,属性的值可以是任何类型,但Map的键和值都必须是字符串。如果需要在Map中保留原始类型,可以使用其他方式进行转换。
总体而言,BeanUtils.toMap方法的原理是基于反射机制,它通过获取JavaBean的属性和值,将它们存储在一个Map中,方便在不同场景中使用。
beanutil常用的方法
beanutil常⽤的⽅法
Apache Common BeanUtil是⼀个常⽤的在对象之间复制数据的⼯具类,著名的web开发框架struts就是依赖于它进⾏ActionForm的创建。
BeanUtil最常⽤的类是mons.beanutils.BeanUtils。
BeanUtils最常⽤的⽅法为:
1. public void copyProperties(ng.Object dest, ng.Object orig) 把orig中的值copy到dest中.
2. public java.util.Map describe(ng.Object bean) 把Bean的属性值放⼊到⼀个Map⾥⾯。
3. public void populate(ng.Object bean, java.util.Map properties) 把properties⾥⾯的值放⼊bean中。
4. public void setProperty(ng.Object bean, ng.String name, ng.Object value) 设置Bean对象的名称为name的property的值为value.
5. public String getProperty(ng.Object bean, ng.String name)
取得bean对象中名为name的属性的值。
详细的使⽤⽅法可以参见官⽅⽹站:
Apache Common BeanUtil的常见使⽤场景。
1. 同类之间不同对象要求进⾏数据复制。
User user1 = …;User user2 = …;BeanUtils. copyProperties(user2,user1);
2. 不同类不同对象之间的数据复制。
java开发BeanUtils类解决实体对象间赋值
java开发BeanUtils类解决实体对象间赋值
实体对象之间相互传值,如:VO对象的值赋给Entity对象,是代码中常⽤功能,如果通过get、set相互赋值,则很⿇烦,借助
⼯具类BeanUtils可以轻松地完成操作。
BeanUtils依赖包导⼊
BeanUtils 是 Apache commons组件的成员之⼀,主要⽤于简化JavaBean封装数据的操作。使⽤BeanUtils必须导⼊相应的jar
包,BeanUtils的maven坐标为
commons-beanutils
commons-beanutils
1.9.4
⽰例
将前端传来的学⽣排名信息(StudentVo对象)分别赋给学⽣对象(StudentEntity)和排名对象(RankingEntity),这三个类
代码如下:
@Data
public class StudentVo {
private String sno;
private String sname;
private Integer ranking;
private String schoolTerm;
public String toString(){
return "studentVo对象的值 sno:"+getSno()+" sname:"+getSname()+" ranking:"+getRanking().toString()+" schoolTerm:"+getSchoolTerm();
}
}
@Data
public class StudentEntity {
private String sno;
private String sname;
private Integer sage;
public String toString(){
return "studentEntity对象的值 sno:"+getSno()+" sname:"+getSname()+" sage:"+getSage();
beanutils.populate用法
1 BeanUtils.populate()是Apache Commons BeanUtils库中的一个方法,用于将一个Map中的属性复制到一个JavaBean对象中。
语法:BeanUtils.populate(Object bean, Map
properties)
参数:
bean: 要复制属性的JavaBean对象
properties: 包含要复制的属性的Map对象
返回值:无
例如:
Map properties = new HashMap<>();
properties.put("name", "John");
properties.put("age", "30");
Person person = new Person();
BeanUtils.populate(person, properties);
System.out.println(person.getName()); //output: John
System.out.println(person.getAge()); //output: 30
这个方法可以用来快速将一个Map中的值复制到一个JavaBean对象中,而不用手动一个属性一个属性的复制。这个方法可能带来了一些安全风险,因为它可能会把Map中的任意属性赋值到JavaBean对象中,如果不小心赋值了不应该赋值的属性可能会导致程序出错。因此,在使用BeanUtils.populate()方法时需要注意安全问题,应该确保Map中只包含需要赋值的属性。
另外还有一点需要注意的是,如果要复制的属性不存在于JavaBean对象中,BeanUtils.populate()方法会抛出一个IllegalAccessException异常,因此需要捕获这个异常并进行相应的处理。
beanutil.copyproperties 枚举类
beanutil.copyproperties 枚举类
在 Java 中,`BeanUtils.copyProperties` 方法通常用于将一个 JavaBean 的属性值拷贝到另一个 JavaBean 中。然而,`Enum` 类型不是常规的 JavaBean,因此 `BeanUtils.copyProperties`
并不直接支持对枚举类的拷贝。
如果你有一个枚举类,想要拷贝其中的属性到另一个对象,你可以使用其他手段实现。以下是一个使用反射和自定义方法的例子:
假设有一个枚举类 `ColorEnum`:
```java
public enum ColorEnum {
RED("FF0000"),
GREEN("00FF00"),
BLUE("0000FF");
private String hexCode;
ColorEnum(String hexCode) {
this.hexCode = hexCode;
}
public String getHexCode() {
return hexCode;
}
}
```
然后有一个普通的 JavaBean 类 `ColorBean`:
```java
public class ColorBean {
private String hexCode;
public String getHexCode() {
return hexCode;
}
public void setHexCode(String hexCode) {
this.hexCode = hexCode;
}
} ```
你可以创建一个工具类,使用反射实现属性的拷贝:
```java
import ng.reflect.Field;
beanutils.copypropertiesforlist用法
beanutils.copypropertiesforlist用法
BeanUtils.copyPropertiesForList使用指南
BeanUtils.copyPropertiesForList是Apache Commons BeanUtils库中的一个方法,用于将一个Java Bean的属性值复制到另一个Java Bean或Java Bean列表中。在本文中,我们将详细介绍BeanUtils.copyPropertiesForList的用法,并提供步骤和示例来帮助读者更好地理解和使用该方法。
第一步:准备工作
在开始使用BeanUtils.copyPropertiesForList之前,我们需要确保项目中已经引入了Apache Commons BeanUtils库。可以通过Maven或手动将所需的依赖项添加到项目构建文件中进行引入。下面是一个Maven项目的示例pom.xml文件,展示了如何引入BeanUtils库:
commons-beanutils
commons-beanutils
1.9.4
同时,我们还需要确保我们有两个Java Bean类:源类(source class)和目标类(target class)。源类是要复制属性值的类,而目标类则是要接收属性值的类。这两个类需要具有相同的属性名称和类型。
第二步:基本使用方法
使用BeanUtils.copyPropertiesForList,我们可以将源类的属性值复制到目标类或目标类列表中。下面是此方法的基本使用方法:
`public static void copyPropertiesForList(List dest, List orig)`
- `dest`:目标类列表,用于接收属性值。
- `orig`:源类列表,从中复制属性值。
请注意,dest和orig可以是相同类型的Java Bean列表,也可以是不同类型的Java Bean列表。
beanutil.copyproperties java 的机制
beanutil.copyproperties java 的机制
BeanUtils.copyProperties()是Apache Commons BeanUtils库中的一个方法,用于将一个Java Bean的属性值复制到另一个Java
Bean中。
该方法的签名如下:
```java
public static void copyProperties(Object destination,
Object source)
```
参数destination是目标对象,source是源对象。该方法会将源对象的属性值复制到目标对象中,属性名和类型必须相同。
BeanUtils.copyProperties()方法的机制如下:
1. 通过反射获取源对象和目标对象的所有属性。
2. 遍历源对象的属性列表。
3. 对于每个属性,获取其名称和值。
4. 判断目标对象是否存在同名属性。
5. 如果目标对象存在同名属性,则将源对象的属性值复制到目标对象中。
6. 如果目标对象不存在同名属性,则忽略该属性。
7. 复制完成后,目标对象的属性值与源对象的属性值相同。
需要注意的是,BeanUtils.copyProperties()方法只会复制两个对象之间的属性值,不会复制对象的引用。如果属性是一个引用类型,只会复制引用的值,而不会复制引用对象的属性值。
此外,BeanUtils.copyProperties()方法还提供了其他一些重载方法,可以根据需要进行属性复制。例如,可以通过指定属性的名称列表来选择要复制的属性,或者可以通过自定义的转换器来进行属性值的转换。
总之,BeanUtils.copyProperties()方法是一个方便的工具,可以快速将一个Java Bean的属性值复制到另一个Java Bean中,减少了手动复制属性的工作量。但需要注意的是,该方法只能复制属性值,不能复制引用对象的属性值。
Java内省机制和BeanUtils实现
Java内省机制和BeanUtils实现
内省(Introspector)
Java 语⾔对 Bean 类属性、事件的⼀种缺省处理⽅法。
例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。
通过 getName/setName 来访问 name 属性,这就是默认的规则。
Java 中提供了⼀套 API ⽤来访问某个属性的 getter/setter ⽅法,这些 API 存放于包 java.beans 中。
⼀般的做法
通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor )。
接着通过这个属性描述器就可以获取某个属性对应的 getter/setter ⽅法,最后我们可以使⽤反射机制来调⽤这些⽅法。
简单例⼦:
public class IntrospectorDemo {
String name;
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public static void main(String[] args) throws Exception {
IntrospectorDemo demo = new IntrospectorDemo();
demo.setName("Winter Lau");
// 如果不想把⽗类的属性也列出来的话,
// 那 getBeanInfo 的第⼆个参数填写⽗类的信息
BeanInfo bi = Introspector.getBeanInfo(demo.getClass(), Object.class);
PropertyDescriptor[] props = bi.getPropertyDescriptors();
java copy实体类字段的方法
java copy实体类字段的方法
Java中复制实体类字段的方法
在Java编程中,有时候我们需要复制一个实体类的字段值到另一个实体类中,这在处理对象拷贝、数据映射等场景中十分常见。本文将介绍几种Java中复制实体类字段的方法。
方法一:使用Getter和Setter方法
这是最基本的复制实体类字段的方法。我们可以通过获取源对象的字段值,然后调用目标对象的Setter方法来设置对应字段的值。
```java
public class Person {
private String name;
private int age;
// 省略构造方法和其他方法
// Getter和Setter方法
public String getName() {
return name;
}
public void setName(String name) {
= name; }
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 复制字段的方法
public class FieldCopyUtil {
public static void copyFields(Person source, Person target) {
target.setName(source.getName());
target.setAge(source.getAge());
}
}
```
以上代码中,我们通过`copyFields`方法来实现字段的复制。通过调用源对象的Getter方法获取字段值,然后再调用目标对象的Setter方法设置字段值。 方法二:使用Java反射机制
BeanUtils的使用
设a,b为对象
BeanUtils.copyProperties(a, b);
如果这里的BeanUtils是org.springframework.beans.BeanUtils,a拷贝到b。
如果BeanUtils是mons.beanutils.BeanUtils,b拷贝到a。、
BeanUtils.copyProperties 和populate的实现方法是将源bean(也可以是Map)中的每个element在转换器(Converter)的帮助下,将转换的结果设置到目标
bean对应的属性中。例如在HTTP应用中需要从http request中抽取数据,http
request传递过来的都是String 或是String数组类型的变量而目标类型可能是各种各样的,例如http request会有一个name=visitDate,value='2009-05-13'的参数,而目标bean 的visitDate属性的类型是java.util.Date。
BeanUtils的copyProperties和populate需要在转换器(converter)的配合下实现源和目标对象之间的数据类型的转 换。在BeanUtils.copyProperties的javadoc中说明的(Copy property values from
the origin bean to the destination bean for all cases where the property
names are the same—— 只要属性名相同就可以从源bean中拷贝值到目标bean中)这句话提供到功能就是要通过转换器才能实现的。在BeanUtils的
copyProperties和populate的使用过程中Converter是一个非常重要的概念,它提供了强大的扩展能力。
/****************************************************************/
