Java常用属性拷贝工具类使用总结
引言
日常开发中经常遇到PO、VO、DTO等对象之间的转换,Java中beanUtil包下则替我们封装实现了类似的功能,可以简化代码,但性能会有所差距。
对项目中经常使用的属性拷贝工具类进行总结:
org.apache.commons.beanutils.BeanUtils
org.apache.commons.beanutils.PropertyUtils
org.springframework.beans.BeanUtils
字段与属性
public class UserTest{
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getHello() {
return "hello";
}
public void setHello(String str) {
}
上面 private String userName;private String password。准确的来说它们应该称为:字段,而不是本次要讲的属性。
下面简述一下:什么是Java中的属性?
Java中的属性(property),通常可以理解为get和set方法,而字段(field),通常叫做“类成员”,或“类成员变量”,有时也叫“域”,理解为“数据成员”,用来承载数据的。
换句话讲Java中的属性是指:设置和读取字段的方法,也就是平常见到的set和get方法。只要是set和get开头的方法在Java里都认为它是属性。
这里再次提醒:字段和属性不是同一个东西。
JDK 中有个API Introspector,获取的是java.beans.BeanInfo 类。
这个类可以通过java.beans.BeanInfo#getPropertyDescriptors : 获取java bean 所有的属性。
public static void main(String[] args) throws IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(UserTest.class);
// 得到类中的所有的属性描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
System.out.println("属性的个数:" + pds.length);
for (PropertyDescriptor pd : pds) {
System.out.println("属性:" + pd.getName());
}
}
result:
属性的个数:4
属性:class
属性:hello
属性:password
属性:userName
上面多了一个 class ,原因很简单,因为Object类是所有类的父类,Object类里有个方法叫 getClass();所以这也验证了咱们刚才说的: “只要是set或者get开头的方法都叫属性”
使用说明
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
public : 对所有类可见。使用对象:类、接口、变量、方法
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
org.springframework.beans.BeanUtils#copyProperties:
基本类型和包装类型会自动转换, 方法名称相同,返回值类型和参数类型不同,不进行复制,也不报错;
支持指定忽略某些属性不复制;
支持类的修饰符 default 、 public。