1.Objects
对于 Objects,我们经常使用的就是两个场景,相等判断和非空判断。
1.1 相等判断
Objects 有提供 equals 和 deepEquals 两个方法来进行相等判断,区别如下:
- equals 是判断基本类型和自定义类的
- deepEquals 是用来判断数组的 从源码中,可以看出 Objects 对基本类型和复杂类型的对象,都有着比较细粒度的判断,可以放心使用。
1.2 非空判断
Objects 提供了各种关于空的一些判断,isNull 和 nonNull 对于对象是否为空返回 Boolean 值,requireNonNull 方法更加严格,如果一旦为空,会直接抛出异常,我们需要根据生活的场景选择使用。
2.BeanUtils
BeanUtils 封装了对Bean操作的一些常用方法(都是静态方法),方便了我们开发,但在使用 BeanUtils 前必须满足以下两个条件:
- jar 包:commons-beanutils 、commons-logging,需要同时下载两个jar包
- javaBean 必须满足三个条件:
- 无参数构造器(不创建有参数构造器,即会有系统默认的无参构造器)
- private变量,成员变量私有
- public get/set(),开放成员变量的get/set方法
2.1 set/getProperty:操作成员变量
// 给指定Bean的指定成员变量设置value
setProperty(Object obj,String name,Object value)
// 获取指定Bean的指定成员变量
getProperty(Object obj,String name)
示例代码如下:
public class Person {
private String name;
private int age;
private String address;
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
---------------------------------------------------------
public static void main(String[] args) throws Exception {
// 通过反射拿到指定类的实例对象
Object bean = Class.forName("com.xupt.yzh.Person").newInstance();
// 通过setProperty给指定Bean设置属性
BeanUtils.setProperty(bean, "name", "test");
System.out.println(bean.toString());
}
可以看到成功设置person属性:
2.2 copyProperties:两个对象属性拷贝
对象属性拷贝。两个对象可以是不同类型,但必须要有相同字段才能拷贝,若目标对象该字段有值,也会被覆盖。
copyProperties(newObject,oldObject)
示例代码如下:
// 新建一个Dog类,与Person相比,没有age属性
public class Dog {
private String name;
private String address;
// 没有age属性
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
---------------------------------------------------------
public static void main(String[] args) throws Exception {
Person person = new Person();
Dog dog = new Dog();
// 给Dog设置属性
dog.setName("zhangsan");
dog.setAddress("beijing");
// 将dog的属性拷贝到person中
BeanUtils.copyProperties(person, dog);
System.out.println(person);
}
可以看到dog的属性止成功拷贝到person实例中:
2.3 populate:将map转为JavaBean
将Map数据封装到指定JavaBean中(成员变量同Map的key),一般用于将表单的所有数据封装到 JavaBean。当无法转换时,需要定义自定义转换器Convert。
populate(Object bean, Map<String,String[]>properties)
示例代码如下:
public static void main(String[] args) throws Exception{
Map<String, String> map = new HashMap<>();
map.put("name", "lisi");
map.put("age", "18");
map.put("address", "xi'an");
// 这三个Key刚好是Person的成员变量名
Person person = new Person();
BeanUtils.populate(person, map);
System.out.println(person);
}
可以看到map成功转化为person: