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 ...
随机推荐
- pythone函数基础(9)操作数据库连接
#操作数据库连接import pymysqlconn = pymysql.connect(host='118.24.3.40',user='jxz', password='123456',port=3 ...
- Java15-java语法基础(十五)——内部类
java16-java语法基础(十五)内部类 一.内部类: 可以在一个类的内部定义另一个类,这种类称为内部类. 二.内部类分为两种类型: 1.静态内部类: 静态内部类是一个具有static修饰词的类, ...
- salt-api配置安装 以及使用
salt-api salt-api是我们通过restful-api调用salt-master的接口,且调用的时候必须通过认证才能调用,认证的用户为系统用户,下面就说说如何配置salt-api. 安装S ...
- How Xtuner E3 works for BMW 520d Diagnosis and initialization of CBS service
Using Xtuner E3 to perform BMW 520d Diagnosis and initialization of CBS service in step by step proc ...
- 服务器重新启动,oracle数据库重新连接问题
最近服务器使用期限到了,用户无法登陆,联系了网络的同事,重新开启了服务器,用户可以重新登陆了,但是在使用oracle数据库的时候,发现报了以下的错误: 很明显是数据库服务没有启动,解决这个问题分两步: ...
- Julia 下载 安装 juno 开发环境搭建
Windows平台 Julia 的官网 (https://julialang.org) 下载链接(https://julialang.org/downloads) 下载完成后,如果想安装在 C 盘,则 ...
- Nginx学习笔记(反向代理&搭建集群)
一.前言 1.1 大型互联网架构演变历程 1.1.1 淘宝技术 淘宝的核心技术(国内乃至国际的 Top,这还是2011年的数据) 拥有全国最大的分布式 Hadoop 集群(云梯,2000左右节点,24 ...
- 【ElasticSearch】 安装
Elasticsearch简介 Elasticsearch 是一个开源的分布式 RESTful 搜索和分析引擎,能够解决越来越多不同的应用场景 官网地址:https://www.elastic.co ...
- 《Linux就该这么学》第二天课程
秦时明月经典语录:很多人被命运安排,而我安排命运.——卫庄 今天介绍了VM 虚拟机的安装以及Linux系统的安装,还讲解了Linux内核 RPM:降低软件的安装难度 源代码+安装规则→将程序源代码与安 ...
- vue使用路由跳转到上一页
this.$router.go(-1) <template> <div> <button class="btn btn-success" @click ...