Apache Commons Beanutils 一 (使用PropertyUtils访问Bean属性)
2017-05-29 15:22
459 查看
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:
/* * 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
相关文章推荐
- Bean属性复制:Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier
- apache-commons之BeanUtils、ConvertUtils、PropertyUtils、CollectionUtils的基本使用
- org.apache.commons.beanutils.PropertyUtils使用明细
- org.apache.commons.beanutils.DynaBean
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- BeanUtils的使用-在具有很多相同属性的两个bean之间复制属性值
- 使用beanUtils操纵bean的属性
- Apache Commons Beanutils对象属性批量复制(pseudo-singleton)
- VerifyError: org/apache/commons/beanutils/PropertyUtilsBean
- 使用BeanUtils操作Bean的各种属性
- BeanUtils的使用-在具有很多相同属性的两个bean之间复制属性值
- 使用org.apache.commons.beanutils个人感受
- Jakarta Commons BeanUtils 拷贝bean属性
- 使用org.apache.commons.beanutils个人感受
- 学会使用BeanUtils 来操作bean属性
- 初用org.apache.commons.beanutils.DynaBean
- 使用beanutils操作bean的属性
- 利用Apache的commons-beanutils和commons-collections包实现Java对象的按属性排序
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)