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 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;
}
}
调用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;
} }
使用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;
}
}
使用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());
}
}
参考资料
源码链接:
https://github.com/peterchenhdu/apache-commons-beanutils-example
Apache Commons Beanutils 一 (使用PropertyUtils访问Bean属性)的更多相关文章
- Apache Commons Beanutils 二 (动态Bean - DynaBeans)
相关背景 上一篇介绍了PropertyUtils的用法,PropertyUtils主要是在不修改bean结构的前提下,动态访问bean的属性: 但是有时候,我们会经常希望能够在不定义一个Java类的前 ...
- 对于Java Bean的类型转换问题()使用 org.apache.commons.beanutils.ConvertUtils)
在进行与数据库的交互过程中,由数据库查询到的数据放在 map 中,由 map 到 JavaBean 的过程中可以使用 BeanUtils.populate(map,bean)来进行转换 这里要处理的问 ...
- Apache Commons BeanUtils
http://commons.apache.org/proper/commons-beanutils/javadocs/v1.9.2/apidocs/org/apache/commons/beanut ...
- Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)
前言 前面已经学习了Apache Commons Beanutils包里的PropertyUtils和动态bean,接下来将学习剩下的几个工具类,个人觉得还是非常实用的,特别是CollectionUt ...
- 关闭log4j 输出 DEBUG org.apache.commons.beanutils.*
2016-03-23 10:52:26,860 DEBUG org.apache.commons.beanutils.MethodUtils - Matching name=getEPort on c ...
- Apache Commons Beanutils对象属性批量复制(pseudo-singleton)
Apache Commons Beanutils为开源软件,可在Apache官网http://commons.apache.org/proper/commons-beanutils/download_ ...
- org.apache.commons.beanutils.BeanMap简单使用例子
一.org.apache.commons.beanutils.BeanMap; 将一个java bean允许通过map的api进行调用, 几个支持的操作接口: Object get(Object ke ...
- org.springframework.beans.BeanUtils与org.apache.commons.beanutils.BeanUtils的copyProperties用法区别
知识点 org.springframework.beans.BeanUtils与org.apache.commons.beanutils.BeanUtils都提供了copyProperties方法,作 ...
- org.apache.commons.beanutils.BeanUtils的常见用法
import org.apache.commons.beanutils.BeanUtils BeanUtils1. public static void copyProperty(Object bea ...
随机推荐
- 开启FIPS协议
Open the 'Run' menu by pressing the combination 'Windows Key + R'.Type 'secpol.msc' and press 'Enter ...
- jquery.validate.js的简单示例
一.官方资料 官网 github 二.html <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...
- 大型互联网 b2b b2c o2o 电子商务微服务云平台
鸿鹄云商大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台. 分布式.微服务.云架构电子商务平台 java ...
- python04 列表 元祖 字典
1.list 有序,元素可以被修改 li=[1,2,2,"am","123"] 列表中的元素可以是数字,字符串,列表等等 支持切片,切片结果为列表 li[3] ...
- Netsharp平台工具常见问题(FAQ)
1. 请问EntityId如何填? 回答:Netsharp中EntityId是经常需要输入的一个字段,因为Netsharp工具一般的源头是实体元数据,也就是一般常说的所谓模型驱动.所以很多工具都需要E ...
- Sublime Text快捷键与插件介绍
Sublime Text快捷键: Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件 ...
- java29
1.封装小练习--长方形 创建长方形类 使用getset方法 利用返回值方法计算长方形的面积,周长. 保证长方形的长宽为整数 2.继承小练习--猫狗 当父类中有构造器时,子类也要有构造器,并且要求设置 ...
- ScheduledExecutorService--目前最理想的定时任务实现方式
ScheduledExecutorService 理想的定时任务实现方式 : 通过线程池的方式来执行任务的 可以灵活的设定第一次执行任务延迟时间 提供了良好的约定,以便设定定时执行的间隔时间代码实现: ...
- python 实践项目 强密码检测
需求:写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令的定义是:长度不少于 8 个字符,同时包含大写和小写字符,至少有一位数字.你可能需要用多个正则表达式来测试该字符串,以保证它的强 ...
- ios 导航push跳转方向设置
CATransition* transition = [CATransition animation]; transition.type = kCATransitionPush;//可更改为其他方式 ...