包结构
Package | Description |
---|---|
org.apache.commons.beanutils | 提供底层工具类,获取Bean属性值,动态定义和访问Bean属性。 |
org.apache.commons.beanutils.converters | 一启动就预注册ConvertUtils 的 Converter 接口的实现 |
org.apache.commons.beanutils.expression | Resolver 接口和实现 |
常用类
常用类都在顶层包中
(1) BeanUtils
通过反射操纵Bean属性,以下静态方法都是使用默认实例,通过使用BeanUtilsBean
可以提供更多复杂操作。
- 克隆对象 cloneBean(Object bean) 无需实现Cloneable,调用了copyProperties()
- 属性拷贝 copyProperties(Object dest, Object orig) copyProperty(Object bean, String name, Object value) 只需字段名一样,自动类型转换。通过反射实现,性能换时间。
- 操纵属性值 getProperty(Object bean, String name) - 获得属性值。作为字符串返回。 setProperty(Object bean, String name, Object value) - 设置属性值。如果赋NULL值,会被设为默认值。 populate(Object bean, Map<String,? extends Object> properties) - 将Map中的数据注入到Bean对象中
(2) ConstructorUtils
通过反射调用构造函数。
- 得到构造方法
getAccessibleConstructor(Class
klass, Class> parameterType) getAccessibleConstructor(Class klass, Class>[] parameterTypes) getAccessibleConstructor(Constructor ctor) - 创建对象
执行构造方法,创建对象
invokeConstructor(Class
klass, Object arg) invokeConstructor(Class klass, Object[] args) invokeConstructor(Class klass, Object[] args, Class<?>[] parameterTypes) - 严格创建对象
对参数要求更加严格,传递进去的参数必须严格符合构造方法的参数列表。
invokeExactConstructor(Class
klass, Object arg) invokeExactConstructor(Class klass, Object[] args) invokeExactConstructor(Class klass, Object[] args, Class<?>[] parameterTypes)
(3) ConvertUtils
可以自定义 Converter
,或使用ConvertUtilsBean
中提供的多种实现,将其与一个类注册,然后调用convert
方法进行转换类型
- 对象转换 convert(Object value) - 对象转换为字符串,类似toString convert(Object value, Class> targetType) - 将对象转换为指定类型对象 convert(String[] values, Class> clazz) - 将数组转换为指定类型对象 convert(String value, Class<?> clazz) - 将字符串转换为指定类型对象
- 管理转换器 移除转换器 - deregister()/deregister(Class> clazz) 查找转换器 - lookup(Class> clazz) ··············· - lookup(Class> sourceType, Class> targetType) 注册转换器 - register(Converter converter, Class<?> clazz)
(4) MethodUtils
通过反射访问对象的方法并且执行方法
- 获取方法 getAccessibleMethod - 获取方法 getMatchingAccessibleMethod - 查找匹配的方法
- 执行方法 invokeMethod - 执行方法 invokeStaticMethod - 执行静态方法 invokeExactMethod - 严格执行方法 invokeExactStaticMethod - 严格执行静态方法
(5) PropertyUtils
通过反射操纵对象getter、setter方法的工具,具体实现由PropertyUtilsBean
提供。
- 简单的属性 getSimpleProperty(Object bean, String name) setSimpleProperty(Object bean, String name, Object value)
- 索引化属性 索引用方括号包起来 getIndexedProperty(Object bean, String name) getIndexedProperty(Object bean, String name, int index) setIndexedProperty(Object bean, String name, int index, Object value) setIndexedProperty(Object bean, String name, Object value)
Employee employee = ...;
int index = ...;
String name = "subordinate[" + index + "]";
Employee subordinate = (Employee)
PropertyUtils.getIndexedProperty(employee, name);
Employee employee = ...;
int index = ...;
Employee subordinate = (Employee)
PropertyUtils.getIndexedProperty(employee, "subordinate", index);
- 映射的属性 键要用括号包起来 getMappedProperty(Object bean, String name) getMappedProperty(Object bean, String name, String key) setMappedProperty(Object bean, String name, Object value) setMappedProperty(Object bean, String name, String key, Object value)
Employee employee = ...;
Address address = ...;
PropertyUtils.setMappedProperty(employee, "address(home)", address);
Employee employee = ...;
Address address = ...;
PropertyUtils.setMappedProperty(employee, "address", "home", address);
- 嵌套的属性 获取属性的属性 Java标准做法
String city = employee.getAddress("home").getCity();
PropertyUtils 提供 getNestedProperty(Object bean, String name) setNestedProperty(Object bean, String name, Object value)
String city = (String)PropertyUtils.getNestedProperty(employee, "address(home).city");
- 通用方法 为了方便起见,PropertyUtils提供了方法重载,接受简单的,索引化的和映射的属性的任意组合,以及任意的嵌套层级:
getProperty(Object bean, String name) setProperty(Object bean, String name, Object value)
Employee employee = ...;
String city = (String) PropertyUtils.getProperty(employee, "subordinate[3].address(home).city");