首页 > 代码库 > Apache Commons Beanutils教程一(访问Bean属性)

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:

  • PropertyUtils.getSimpleProperty(Object, String)
  • PropertyUtils.setSimpleProperty(Object, String, Object)

调用示例:

/* * 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

  • PropertyUtils.getIndexedProperty(Object, String)
  • PropertyUtils.getIndexedProperty(Object, String, int)
  • PropertyUtils.setIndexedProperty(Object, String, Object)
  • PropertyUtils.setIndexedProperty(Object, String, int, Object)

调用示例

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;    }}
View Code

调用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:

  • PropertyUtils.getMappedProperty(Object, String)
  • PropertyUtils.getMappedProperty(Object, String, String)
  • PropertyUtils.setMappedProperty(Object, String, Object)
  • PropertyUtils.setMappedProperty(Object, String, String, Object)

调用示例:

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;    }}
View Code

使用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:

  • PropertyUtils.getNestedProperty(Object, String)
  • PropertyUtils.setNestedProperty(Object, String, Object)

调用示例:

嵌套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;    }}
View Code

使用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

  • PropertyUtils.getProperty(Object, String)
  • PropertyUtils.setProperty(Object, String, Object)

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

/* * 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

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