【Java杂记】工具类:对象工具类 Objects&BeanUtils

408 阅读3分钟

1.Objects

对于 Objects,我们经常使用的就是两个场景,相等判断和非空判断。

1.1 相等判断

Objects 有提供 equals 和 deepEquals 两个方法来进行相等判断,区别如下:

  • equals 是判断基本类型和自定义类的
  • deepEquals 是用来判断数组的 图片描述从源码中,可以看出 Objects 对基本类型和复杂类型的对象,都有着比较细粒度的判断,可以放心使用。

1.2 非空判断

在这里插入图片描述

Objects 提供了各种关于空的一些判断,isNull 和 nonNull 对于对象是否为空返回 Boolean 值,requireNonNull 方法更加严格,如果一旦为空,会直接抛出异常,我们需要根据生活的场景选择使用。

2.BeanUtils

BeanUtils 封装了对Bean操作的一些常用方法(都是静态方法),方便了我们开发,但在使用 BeanUtils 前必须满足以下两个条件:

  1. jar 包:commons-beanutils 、commons-logging,需要同时下载两个jar包 在这里插入图片描述
  2. 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: 在这里插入图片描述