Apache Commons Beanutils教程一(访问Bean属性)

BeanUtils简要描述

beanutils,顾名思义,是java bean的一个工具类,可以帮助我们方便的读取(get)和设置(set)bean属性值、动态定义和访问bean属性;

细心的话,会发现其实JDK已经提供了一个java.beans包,同样可以实现以上功能,只不过使用起来比较麻烦,所以诞生了apache commons beanutils;

看源码就知道,其实apache commons beanutils就是基于jdk的java.beans包实现的。

Java Bean

在介绍apache commons beanutils之前,很有必要先了解下javabean。

apache commons beanutils就是基于JavaBeans的设计命名规范来实现的,如下是一个简单的javabean示例:

/*
 * File Name: Employee.java
 * Description:
 * Author: PiChen
 * Create Date: 2017年5月29日
 */
package apache.commons.beanutils.example.pojo;

import java.util.Date;

/**
 *
 * @author PiChen
 * @version 2017年5月29日
 */

public class Employee
{
    private String firstName;
    private String lastName;
    private Date hireDate;
    private boolean isManager;/**
     * @return the firstName
     */
    public String getFirstName()
    {
        return firstName;
    }

    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }

    /**
     * @return the lastName
     */
    public String getLastName()
    {
        return lastName;
    }

    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName)
    {
        this.lastName = lastName;
    }

    /**
     * @return the hireDate
     */
    public Date getHireDate()
    {
        return hireDate;
    }

    /**
     * @param hireDate the hireDate to set
     */
    public void setHireDate(Date hireDate)
    {
        this.hireDate = hireDate;
    }

    /**
     * @return the isManager
     */
    public boolean isManager()
    {
        return isManager;
    }

    /**
     * @param isManager the isManager to set
     */
    public void setManager(boolean isManager)
    {
        this.isManager = isManager;
    }

    /**
     * @return the fullName
     */
    public String getFullName()
    {
        return firstName + " " + lastName;
    }

}

javabean一般有以下几个特性:

1、类必须是public访问权限,且需要有一个public的无参构造方法,之所以这样主要是方便利用Java的反射动态创建对象实例:

Class beanClass = Class.forName(className);
Object beanInstance = beanClass.newInstance();

2、由于javabean的构造方法是无参的,所以我们的bean的行为配置(即设置bean的属性值,方法对应行为,属性对应数据)不能在构造方法完成,取而代之的是通过一系列的set方法来设置属性值,通过setter方法,我们可以改变javabean呈现出来的行为和内部数据,这里的setter方法会按一定的约定来命名,如setHireDate、setName。。。

3、读取和设置bean属性值的命名约定,即getter方法和setter方法,不过这里需要特别注意boolean类型的约定,如下示例:

    private String firstName;
    private String lastName;
    private Date hireDate;
    private boolean isManager;
    public String getFirstName();
    public void setFirstName(String firstName);
    public String getLastName();
    public void setLastName(String lastName);
    public Date getHireDate();
    public void setHireDate(Date hireDate);
    public boolean isManager();
    public void setManager(boolean manager);

4、并不是必须为每个属性提供setter和getter方法,我们可以只定义一个属性的getter方法而不定义setter方法,这样的属性一般是只读属性;

访问基本数据类型的Bean属性

简述:

  这类属性指的是Integer, Double, Float, boolean等,,,, 注意这里还包括String,其实像HashMap,ArrayList, 等属性都可以设置,只不过Map里面的键值对、List索引处的值无法通过这两个API访问,需要使用专门的API来处理,接下来将会介绍;

访问API:

调用示例:

/*
 * File Name: Main.java
 * Description:
 * Author: PiChen
 * Create Date: 2017年5月29日
 */
package apache.commons.beanutils.example.propertyaccess;

import java.lang.reflect.InvocationTargetException;

import org.apache.commons.beanutils.PropertyUtils;

import apache.commons.beanutils.example.pojo.Employee;

/**
 *
 * @author PiChen
 * @version 2017年5月29日
 */

public class BasicPropertyAccess
{

    /**
     *
     *
     * @param args
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */

    public static void main(String[] args)
        throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    {
        Employee employee = new Employee();
        String firstName = (String) PropertyUtils.getSimpleProperty(employee, "firstName");
        String lastName = (String) PropertyUtils.getSimpleProperty(employee, "lastName");

        firstName = firstName == null ? "Pi" : "";
        lastName = lastName == null ? "Chen" : "";

        PropertyUtils.setSimpleProperty(employee, "firstName", firstName);
        PropertyUtils.setSimpleProperty(employee, "lastName", lastName);

        System.out.println(employee.getFullName());
    }

}

访问索引类型的Bean属性

简述:

  可索引的属性,如ArrayList, 数组等,可以通过下标索引来访问Bean属性的值, 同理可设置value;

访问API

调用示例

Bean:

package apache.commons.beanutils.example.pojo;

import java.util.List;

public class IndexedBean {
    private List<Employee> employeeList;
    private Integer[] intArr;

    /**
     * @return the employeeList
     */
    public List<Employee> getEmployeeList()
    {
        return employeeList;
    }

    /**
     * @param employeeList the employeeList to set
     */
    public void setEmployeeList(List<Employee> employeeList)
    {
        this.employeeList = employeeList;
    }

    /**
     * @return the intArr
     */
    public Integer[] getIntArr()
    {
        return intArr;
    }

    /**
     * @param intArr the intArr to set
     */
    public void setIntArr(Integer[] intArr)
    {
        this.intArr = intArr;
    }
}

调用example:

/*
 * File Name: Main.java
 * Description:
 * Author: PiChen
 * Create Date: 2017年5月29日
 */
package apache.commons.beanutils.example.propertyaccess;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.PropertyUtils;

import apache.commons.beanutils.example.pojo.Employee;
import apache.commons.beanutils.example.pojo.IndexedBean;

/**
 *
 * @author PiChen
 * @version 2017年5月29日
 */

public class IndexedPropertiesAccess
{

    /**
     *
     *
     * @param args
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */

    public static void main(String[] args)
        throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    {
        // 初始工作
        IndexedBean indexedBean = new IndexedBean();
        List<Employee> employeeList = new ArrayList<Employee>();
        Employee e1 = new Employee();
        e1.setLastName("Chen");
        Employee e2 = new Employee();
        e2.setLastName("Wang");
        employeeList.add(e1);
        employeeList.add(e2);
        indexedBean.setEmployeeList(employeeList);
        indexedBean.setIntArr(new Integer[]{ 0, 1, 2 });

        // API测试
        int index0 = 0;
        String name0 = "employeeList[" + index0 + "]";
        Employee employee0 = (Employee) PropertyUtils.getIndexedProperty(indexedBean, name0);
        System.out.println(employee0.getLastName());

        int index1 = 1;
        String name1 = "employeeList[" + index1 + "]";
        Employee employee1 = (Employee) PropertyUtils.getIndexedProperty(indexedBean, name1);
        System.out.println(employee1.getLastName());

        Employee employee00 = (Employee) PropertyUtils.getIndexedProperty(indexedBean,"employeeList", 0);
        Employee employee11 = (Employee) PropertyUtils.getIndexedProperty(indexedBean,"employeeList", 1);
        System.out.println(employee00.getLastName());
        System.out.println(employee11.getLastName());

        Integer i = (Integer) PropertyUtils.getIndexedProperty(indexedBean,"intArr", 1);
        System.out.println(i);
    }

}

访问Map映射类型的Bean属性

简述:

  常见的HashMap,TreeMap等,可以通过key来访问Bean属性值,同理可设置value;

访问API:

调用示例:

map bean:

/*
 * File Name: MappedBean.java
 * Description:
 * Author: PiChen
 * Create Date: 2017年5月29日
 */
package apache.commons.beanutils.example.pojo;

import java.util.Map;

/**
 *
 * @author    PiChen
 * @version   2017年5月29日
 */

public class MappedBean
{
    private Map<String, Object> mapProperty;

    /**
     * @return the mapProperty
     */
    public Map<String, Object> getMapProperty()
    {
        return mapProperty;
    }

    /**
     * @param mapProperty the mapProperty to set
     */
    public void setMapProperty(Map<String, Object> mapProperty)
    {
        this.mapProperty = mapProperty;
    }

}

使用example:

/*
 * File Name: MapPropertyAccess.java
 * Description:
 * Author: PiChen
 * Create Date: 2017年5月29日
 */
package apache.commons.beanutils.example.propertyaccess;

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

import org.apache.commons.beanutils.PropertyUtils;
import apache.commons.beanutils.example.pojo.MappedBean;

/**
 *
 * @author    PiChen
 * @version   2017年5月29日
 */

public class MapPropertyAccess
{

    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    {
        MappedBean employee = new MappedBean();
        Map<String, Object> map = new HashMap<String, Object>();
        //employee.setMapProperty(map);
        PropertyUtils.setSimpleProperty(employee, "mapProperty", map);

        PropertyUtils.setMappedProperty(employee, "mapProperty", "testKey1", "testValue1");
        PropertyUtils.setMappedProperty(employee, "mapProperty(testKey2)", "testValue2");

        System.out.println(employee.getMapProperty().get("testKey1"));
        System.out.println(employee.getMapProperty().get("testKey2"));

    }
}

访问嵌套类型的Bean属性

简述:

  指的是对象内嵌套对象

访问API:

调用示例:

嵌套bean:

/*
 * File Name: NestedBean.java
 * Description:
 * Author: PiChen
 * Create Date: 2017年5月29日
 */
package apache.commons.beanutils.example.pojo;

import java.util.List;
import java.util.Map;

/**
 *
 * @author    PiChen
 * @version   2017年5月29日
 */

public class NestedBean
{

    private List<Employee> listProperty;
    private Map<String, Employee> mapProperty;
    /**
     * @return the listProperty
     */
    public List<Employee> getListProperty()
    {
        return listProperty;
    }
    /**
     * @param listProperty the listProperty to set
     */
    public void setListProperty(List<Employee> listProperty)
    {
        this.listProperty = listProperty;
    }
    /**
     * @return the mapProperty
     */
    public Map<String, Employee> getMapProperty()
    {
        return mapProperty;
    }
    /**
     * @param mapProperty the mapProperty to set
     */
    public void setMapProperty(Map<String, Employee> mapProperty)
    {
        this.mapProperty = mapProperty;
    }
}

使用example:

/*
 * File Name: NestedPropertyAccess.java
 * Description:
 * Author: PiChen
 * Create Date: 2017年5月29日
 */
package apache.commons.beanutils.example.propertyaccess;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;

import apache.commons.beanutils.example.pojo.Employee;
import apache.commons.beanutils.example.pojo.NestedBean;

/**
 *
 * @author PiChen
 * @version 2017年5月29日
 */

public class NestedPropertyAccess
{

    public static void main(String[] args)
        throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    {
        Employee e = new Employee();
        e.setLastName("Chen");

        NestedBean nestedBean = new NestedBean();

        List<Employee> list = new ArrayList<Employee>();
        list.add(e);

        Map<String, Employee> map = new HashMap<String, Employee>();
        map.put("testKey", e);

        nestedBean.setListProperty(list);
        nestedBean.setMapProperty(map);

        String lastName = (String) PropertyUtils.getNestedProperty(nestedBean,
            "mapProperty(testKey).lastName");
        System.out.println(lastName);
        String lastName2 = (String) PropertyUtils.getNestedProperty(nestedBean,
            "listProperty[0].lastName");
        System.out.println(lastName2);
    }
}

访问所有类型的Bean属性

简述

  通过以上API的使用,我们了解了各类bean属性的访问方法,其实还有一种通用的方法,适用于各类bean属性类型;

访问API

使用示例,这里直接以嵌套类型属性为例

/*
 * File Name: NestedPropertyAccess.java
 * Description:
 * Author: PiChen
 * Create Date: 2017年5月29日
 */
package apache.commons.beanutils.example.propertyaccess;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;

import apache.commons.beanutils.example.pojo.Employee;
import apache.commons.beanutils.example.pojo.NestedBean;

/**
 *
 * @author PiChen
 * @version 2017年5月29日
 */

public class NestedPropertyAccess
{

    public static void main(String[] args)
        throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    {
        Employee e = new Employee();
        e.setLastName("Chen");

        NestedBean nestedBean = new NestedBean();

        List<Employee> list = new ArrayList<Employee>();
        list.add(e);

        Map<String, Employee> map = new HashMap<String, Employee>();
        map.put("testKey", e);

        nestedBean.setListProperty(list);
        nestedBean.setMapProperty(map);

        String lastName2 = (String) PropertyUtils.getProperty(nestedBean,
            "listProperty[0].lastName");
        System.out.println(lastName2);

        PropertyUtils.setProperty(nestedBean, "listProperty[0].lastName", "Hello World");
        System.out.println(nestedBean.getListProperty().get(0).getLastName());
    }
}

参考资料

commons.apache.org/proper/commons-beanutils/javadocs/v1.9.3/apidocs/org/apache/commons/beanutils/package-summary.html

源码链接:

https://github.com/peterchenhdu/apache-commons-beanutils-example

时间: 2024-10-13 15:22:54

Apache Commons Beanutils教程一(访问Bean属性)的相关文章

Apache Commons Beanutils 二 (动态Bean - DynaBeans)

相关背景 上一篇介绍了PropertyUtils的用法,PropertyUtils主要是在不修改bean结构的前提下,动态访问bean的属性: 但是有时候,我们会经常希望能够在不定义一个Java类的前提下,动态决定这个类中包含哪些属性,并动态访问它们的属性值,比较典型的使用场景是作为SQL查询的结果集的bean: 为了支持以上特性,Apache Commons Beanutils包为我们提供了DynaBean接口.DynaClass接口: 举个简单例子如下: DynaProperty[] pro

Apache commons beanutils简介和使用

在一般的写bean组件的时候,都必须要写setter和getter方法,当然假如我们事先已经知道bean的相关属性和方法,写bean是比较简单的,但是组件太多的时候,重复编写经常是枯燥乏味令人厌烦的.但当有些时候我么需要调用动态对象的属性的时候,我们应该怎么来设定和获取对象的属性呢?BeanUtils就可以帮助我们来简化解决这个问题. 目前最新的版本是1.9. 在日常的开发中,下面类似的代码应该是非常的眼熟. DynaActionForm daf =(DynaActionForm)form ;

Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

前言 前面已经学习了Apache Commons Beanutils包里的PropertyUtils和动态bean,接下来将学习剩下的几个工具类,个人觉得还是非常实用的,特别是CollectionUtils: BeanUtils 简单介绍下两个方法的使用,populate和copyProperties, populate可以帮助我们把Map里的键值对值拷贝到bean的属性值中: copyProperties,顾名思义,帮我们拷贝一个bean的属性到另外一个bean中,注意是浅拷贝 如下示例: /

访问bean属性 访问参数值

访问bean属性 class user{ String name; public String getName(){ return name; } } ${user.name} 访问参数值 localhost:8080/web01/a.jsp?name=hzz;interest=football,fishing ${param.name} ${paramValues.interest[0]}

myeclipse的项目导入到eclipse下,com.sun.org.apache.commons.beanutils.BeanUtils不能导入

com.sun.org.apache.commons.beanutils.BeanUtils这个包不能引入了怎么办自己下了个org.apache.commons的jar包了之后,改成import org.apache.commons.beanutils.BeanUtils 编译能通过了.但是用到beanutils的时候会报错,java.lang.reflect.InvocationTargetException java.lang.NoClassDefFoundError: org/apache

java.lang.NoClassDefFoundError: org/apache/commons/beanutils/BeanUtils

在servlet类中使用Beanutils方法封装前端注册界面信息,浏览器中报错,状态码500,报错信息: 解决办法: 在Tomcat和web下的lib包中都要导入commons-beanutils-1.8.3.jar这个jar包. ^_^ 原文地址:https://www.cnblogs.com/kongieg/p/10126746.html

一篇关于apache commons类库的详解

原文 http://blog.csdn.net/wiker_yong/article/details/23551209 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta Commons就是这样的一个框架.如果你至少参与了一个中型规模的Java项目,那么我想有超过一大半的机会你都接触和使用到了Jakarta Commons,不管你自己有没有察觉.就我所

apache commons类库的学习

原文地址http://www.tuicool.com/articles/iyEbquE 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta Commons就是这样的一个框架.如果你至少参与了一个中型规模的Java项目,那么我想有超过一大半的机会你都接触和使用到了Jakarta Commons,不管你自己有没有察觉.就我所知,除了Apache Jakar

apache commons Java包简介

更多信息,请参考:http://commons.apache.org/ 一.Commons BeanUtils说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 二.Commons CLI说明:这是一个处理命令的工具.比如main方法输入的string[]需要解析.你可以预先定义好参数的规则,然后就可以调用CLI来解析. 三.Commons Codec说明:这个工具是用来编码和解码的,包括Base64,URL,Sound