工具类commons-beanutils介绍
对象结构图如下:
常用工具类介绍:
ContextClassLoaderLocal:使用当前线程的ClassLoader作为key,为同一个ClassLoader内的多线程共享对象(一般是指同一个容器内)而提供的工具类;
BeanUtils、BeanUtilsBean:提供对标准JavaBean和动态bean的操作;主要功能是复制bean中的内容,拷贝bean,为bean中的内容赋值和读取bean中内容;调用bean的setter方法会先做类型转换;BeanUtils与BeanUtilsBean的关系,类似于外套与内衣的关系;
ConvertUtils、ConvertUtilsBean:类型转换工具类;
PropertyUtils、PropertyUtilsBean:属性操作工具类;调用bean的setter方法不会做类型转换;
MethodUtils:方法工具类;
ConstructorUtils:构造函数工具类;
LocaleBeanUtils、LocaleBeanUtilsBean:和BeanUtils作用类似,但在执行相应方法时可以进行地区敏感数据的转换;
建议:还有一个基础库commons-lang必不可少,可以结合使用;
类型转换工具ConvertUtilsBean注册的类型如下://
默认注册类型
public void deregister() {
converters.clear();
registerPrimitives(false);
registerStandard(false, false);
registerOther(true);
registerArrays(false, 0);
register(BigDecimal.class, new
BigDecimalConverter());
register(BigInteger.class, new
BigIntegerConverter());
}
// 基础类型
private void registerPrimitives(boolean throwException) {
register(Boolean.TYPE, throwException ? new
BooleanConverter() : new BooleanConverter(Boolean.FALSE));
register(Byte.TYPE, throwException ? new
ByteConverter() : new ByteConverter(ZERO));
register(Character.TYPE, throwException ? new
CharacterConverter() : new
CharacterConverter(SPACE));
register(Double.TYPE, throwException ? new
DoubleConverter() : new DoubleConverter(ZERO));
register(Float.TYPE, throwException ? new
FloatConverter() : new FloatConverter(ZERO));
register(Integer.TYPE, throwException ? new
IntegerConverter() : new IntegerConverter(ZERO));
register(Long.TYPE, throwException ? new
LongConverter() : new LongConverter(ZERO));
register(Short.TYPE, throwException ? new
ShortConverter() : new ShortConverter(ZERO));
}
// 标准类型
private void registerStandard(boolean throwException, boolean
defaultNull) {
Number defaultNumber = defaultNull ? null : ZERO;
BigDecimal
bigDecDeflt = defaultNull ? null : new BigDecimal("0.0");
BigInteger
bigIntDeflt = defaultNull ? null : new BigInteger("0");
Boolean booleanDefault = defaultNull ? null : Boolean.FALSE;
Character charDefault = defaultNull ? null : SPACE;
String stringDefault = defaultNull ? null : "";
register(BigDecimal.class, throwException ?
new BigDecimalConverter() : new
BigDecimalConverter(bigDecDeflt));
register(BigInteger.class, throwException ? new
BigIntegerConverter() : new
BigIntegerConverter(bigIntDeflt));
register(Boolean.class, throwException ? new
BooleanConverter() : new BooleanConverter(booleanDefault));
register(Byte.class, throwException ? new
ByteConverter() : new ByteConverter(defaultNumber));
register(Character.class, throwException ? new CharacterConverter() : new
CharacterConverter(charDefault));
register(Double.class, throwException ? new
DoubleConverter() : new DoubleConverter(defaultNumber));
register(Float.class, throwException ? new
FloatConverter() : new FloatConverter(defaultNumber));
register(Integer.class, throwException ? new
IntegerConverter() : new IntegerConverter(defaultNumber));
register(Long.class, throwException ? new
LongConverter() : new LongConverter(defaultNumber));
register(Short.class, throwException ? new
ShortConverter() : new ShortConverter(defaultNumber));
register(String.class, throwException ? new
StringConverter() : new StringConverter(stringDefault));
}
// 其他类型
private void registerOther(boolean throwException) {
register(Class.class, throwException ? new
ClassConverter() : new ClassConverter(null));
register(java.util.Date.class, throwException ?
new
DateConverter() : new DateConverter(null));
register(Calendar.class, throwException ? new
CalendarConverter() : new CalendarConverter(null));
register(File.class, throwException ? new
FileConverter() : new FileConverter(null));
register(java.sql.Date.class, throwException ?
new
SqlDateConverter() : new SqlDateConverter(null));
register(java.sql.Time.class, throwException ?
new
SqlTimeConverter() : new SqlTimeConverter(null));
register(Timestamp.class, throwException ? new SqlTimestampConverter() : new
SqlTimestampConverter(null));
register(URL.class, throwException ? new
URLConverter() : new URLConverter(null));
}
// 数组类型
private void registerArrays(boolean throwException, int
defaultArraySize) {
// Primitives
registerArrayConverter(Boolean.TYPE, new BooleanConverter(), throwException, defaultArraySize);
registerArrayConverter(Byte.TYPE, new
ByteConverter(), throwException, defaultArraySize);
registerArrayConverter(Character.TYPE, new
CharacterConverter(), throwException, defaultArraySize);
registerArrayConverter(Double.TYPE, new
DoubleConverter(), throwException, defaultArraySize);
registerArrayConverter(Float.TYPE, new
FloatConverter(), throwException, defaultArraySize);
registerArrayConverter(Integer.TYPE, new IntegerConverter(), throwException, defaultArraySize);
registerArrayConverter(Long.TYPE, new
LongConverter(), throwException, defaultArraySize);
registerArrayConverter(Short.TYPE, new
ShortConverter(), throwException, defaultArraySize);
// Standard
registerArrayConverter(BigDecimal.class, new
BigDecimalConverter(), throwException, defaultArraySize);
registerArrayConverter(BigInteger.class, new
BigIntegerConverter(), throwException, defaultArraySize);
registerArrayConverter(Boolean.class, new
BooleanConverter(), throwException, defaultArraySize);
registerArrayConverter(Byte.class, new
ByteConverter(), throwException, defaultArraySize);
registerArrayConverter(Character.class, new CharacterConverter(), throwException,
defaultArraySize);
registerArrayConverter(Double.class, new
DoubleConverter(), throwException, defaultArraySize);
registerArrayConverter(Float.class, new
FloatConverter(), throwException, defaultArraySize);
registerArrayConverter(Integer.class, new
IntegerConverter(), throwException, defaultArraySize);
registerArrayConverter(Long.class, new
LongConverter(), throwException, defaultArraySize);
registerArrayConverter(Short.class, new
ShortConverter(), throwException, defaultArraySize);
registerArrayConverter(String.class, new
StringConverter(), throwException, defaultArraySize);
// Other
registerArrayConverter(Class.class, new
ClassConverter(), throwException, defaultArraySize);
registerArrayConverter(java.util.Date.class, new
DateConverter(), throwException, defaultArraySize);
registerArrayConverter(Calendar.class, new
DateConverter(), throwException, defaultArraySize);
registerArrayConverter(File.class, new
FileConverter(), throwException, defaultArraySize);
registerArrayConverter(java.sql.Date.class, new
SqlDateConverter(), throwException, defaultArraySize);
registerArrayConverter(java.sql.Time.class, new
SqlTimeConverter(), throwException, defaultArraySize);
registerArrayConverter(Timestamp.class, new SqlTimestampConverter(), throwException,
defaultArraySize);
registerArrayConverter(URL.class, new
URLConverter(), throwException, defaultArraySize);
}
注意:如果需要注册自定义类型,可以调用ConvertUtils的public
static void register(Converter converter, Class
clazz)方法进行注册;
示例:
package com.ipan.project.test;
import java.util.Date;
public class User {
private Long id;
private String name;
private int age;
private Date birthday;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
package com.ipan.project.test;
import java.util.Date;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConstructorUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.junit.Test;
public class MyTest {
@Test
public void propertyTest() {
User user = null;
// 创建对象
try {
user = (User)
ConstructorUtils.invokeConstructor(User.class, null);
} catch (Exception e) {
e.printStackTrace();
}
// 设置属性
try {
BeanUtils.setProperty(user,
"id", "100");
BeanUtils.setProperty(user,
"name", "小王");
BeanUtils.setProperty(user,
"age", "28");
BeanUtils.setProperty(user,
"birthday", DateUtils.parseDate("1986-01-01", new
String[]{"yyyy-MM-dd"}));
} catch (Exception e) {
e.printStackTrace();
}
// 输出属性
try {
Long id =
(Long) PropertyUtils.getProperty(user, "id");
String name =
(String) PropertyUtils.getProperty(user, "name");
int age =
(Integer) PropertyUtils.getProperty(user, "age");
Date date =
(Date) PropertyUtils.getProperty(user, "birthday");
System.out.println("[id="
+ id + ", name=" + name + ", age=" + age + ", date=" +
DateFormatUtils.format(date,
"yyyy-MM-dd") + "]");
} catch (Exception e) {
e.printStackTrace();
}
// 修改属性
try {
String method
= "set" + StringUtils.capitalize("age");
Object
targetVal = ConvertUtils.convert("29",
PropertyUtils.getPropertyDescriptor(user,
"age").getPropertyType());
MethodUtils.invokeMethod(user,
method, targetVal);
method =
PropertyUtils.getPropertyDescriptor(user,
"age").getReadMethod().getName();
System.out.println("new
age=" + MethodUtils.invokeMethod(user, method, null));
} catch (Exception e) {
e.printStackTrace();
}
}
}
动态JavaBean
对象结构图如下:
每一个JavaBean对象都对应着一个Class对象,并且每个运行中的JavaBean不能增加或者删除属性;为了解决这个问题,提供了DynaBean对象,以上的工具类均兼容动态Bean以及标准JavaBean;
但是,在实际项目中,几乎非常少需要使用动态Bean,所以这块不做深入讨论;等用到后,再说;