13544870125 发表于 2017-12-24 10:04:22

Apache Commons Beanutils 一 (使用PropertyUtils访问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>  
{
  
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 =>
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>  
{
  

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

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

  
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>  
{
  

  
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>  
{
  

  
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.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>  
{
  

  
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.lastName");
  
System.out.println(lastName2);
  

  
PropertyUtils.setProperty(nestedBean, "listProperty.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
页: [1]
查看完整版本: Apache Commons Beanutils 一 (使用PropertyUtils访问Bean属性)