Jakarta-Common-BeanUtils使用笔记

本文详细介绍Apache Commons BeanUtils组件的功能及应用场景,包括直接读写Bean属性、Bean间克隆、Map填充Bean、动态Bean创建及BeanUtils与PropertyUtils的区别。

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

下载地址:http://commons.apache.org/beanutils/

例子如下:

新建Bean:

package  demo.bean;

import  java.util.ArrayList;
import  java.util.HashMap;

public   class  Company  {

    
private String name;
    
private HashMap<String, String> address = new HashMap<String, String>();
    
private String[] otherInfo;
    
private ArrayList<String> product;
    
private ArrayList<String> employee;
    
private HashMap<String, String> telephone;
    
    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public HashMap<String, String> getAddress() {
        
return address;
    }

    
public void setAddress(HashMap<String, String> address) {
        
this.address = address;
    }

    
public String[] getOtherInfo() {
        
return otherInfo;
    }

    
public void setOtherInfo(String[] otherInfo) {
        
this.otherInfo = otherInfo;
    }

    
public ArrayList<String> getProduct() {
        
return product;
    }

    
public void setProduct(ArrayList<String> product) {
        
this.product = product;
    }

    
public ArrayList<String> getEmployee() {
        
return employee;
    }

    
public void setEmployee(ArrayList<String> employee) {
        
this.employee = employee;
    }

    
public HashMap<String, String> getTelephone() {
        
return telephone;
    }

    
public void setTelephone(HashMap<String, String> telephone) {
        
this.telephone = telephone;
    }

}

 A.BeanUtils可以直接get和set一个属性的值。

package  demo;

import  java.lang.reflect.InvocationTargetException;
import  java.util.HashMap;

import  org.apache.commons.beanutils.BeanUtils;

import  demo.bean.Company;

public   class  BeanUtilsDemo  {

    
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        
        Company c 
= new Company();
        
        c.setName(
"Lucy");
        System.out.println(BeanUtils.getProperty(c, 
"name"));
        
        HashMap
<String, String> am = new HashMap<String, String>();
        am.put(
"1","234-222-1222211");
        am.put(
"2","021-086-1232323");
        BeanUtils.setProperty(c,
"telephone",am);
        
        System.out.println(c.getTelephone().get(
"1"));
    }

}

B.copyProperty方法可以直接进行Bean之间的clone。

package  demo;

import  java.lang.reflect.InvocationTargetException;

import  org.apache.commons.beanutils.BeanUtils;

import  demo.bean.Company;

public   class  BeanUtilsDemo  {

    
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        
        Company c 
= new Company();
        c.setName(
"Lucy");
        
        Company c2 
= new Company();
        BeanUtils.copyProperties(c2, c);
        
        System.out.println(BeanUtils.getProperty(c2, 
"name"));
    }

}

注:但是这种copy都是浅拷贝,复制后的2个Bean的同一个属性可能拥有同一个对象的ref,这个在使用时要小心,特别是对于属性为自定义类的情况。

C.populate方法用于将一个map的值填充到一个bean中。

package  demo;

import  java.lang.reflect.InvocationTargetException;
import  java.util.HashMap;

import  org.apache.commons.beanutils.BeanUtils;

import  demo.bean.Company;

public   class  BeanUtilsDemo  {

    
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        
        HashMap
<String, String> map = new HashMap<String, String>();
        map.put(
"name""Lucy");
        
        Company c 
= new Company();
        BeanUtils.populate(c, map);
        
        System.out.println(c.getName());
    }

}

D.LazyDynaBean,实现一个动态的Bean,可以直接往里面加入属性,作为一个JavaBean一样使用,也可以用上面的BeanUtils或get/set方法进行操作,而不用事先定义一个标准的JavaBean类

package  demo;

import  java.lang.reflect.InvocationTargetException;
import  java.util.Map;

import  org.apache.commons.beanutils.LazyDynaMap;

public   class  BeanUtilsDemo  {

    
public static void main(String[] args) throws IllegalAccessException,
            InvocationTargetException, NoSuchMethodException 
{

        LazyDynaMap dynaBean1 
= new LazyDynaMap();
        dynaBean1.set(
"foo""bar");
        dynaBean1.set(
"customer""title""Mr");
        dynaBean1.set(
"address"0"address1");
        System.out.println(dynaBean1.get(
"address"0));
        Map myMap 
= dynaBean1.getMap();
        System.out.println(myMap.toString());
    }

}

注:对于这个类还有两个重要的Field要注意:returnnull——指定在get方法使用了一个没有定义过的property时,DynaBean的行为//取的字段的信息

dynaBean1.setReturnNull(true);//设为ture。若Bean中没有此字段,返回null
//默认为false。若Bean中没有此字段,自动增加一个:)
System.out.println(dynaBean1.get("aaa"));//此时返回null
Restricted——指定是否允许改变这个bean的property。
//MutableDynaClass.setRestricted设为true后,字段不可再增删和修改.
//默认为false,允许增删和修改
dynaBean1.setRestricted(true);
dynaBean1.set("test","error");//这里会出错!

过设置这两个属性,可以防止意外修改DynaBean的property。在设计架构时,你可以在后台从数据表或xml文件自动产生DynaBean,在传到控制层和表示层之前设置上述属性使其Bean结构不允许修改,如此就不可能无意中修改Bean包含的属性。

E.BeanUtils和PropertyUtils

这两个类几乎有一摸一样的功能,唯一的区别是:BeanUtils在对Bean赋值是会进行类型转化。举例来说也就是在copyProperty时只要属性名相同,就算类型不同,BeanUtils也可以进行copy;而PropertyBean则可能会报错!!
当然,若实现了org.apache.commons.beanutils.Converter接口则可以自定义类型之间的转化。
由于不做类型转化,用PropertyUtils在速度上会有很大提高!

详细请参阅:http://www.nihaoblog.com/1_5146.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值