您的位置:首页 > 运维架构 > Apache

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: