Bean 工具 - BeanUtil
# Bean 工具 - BeanUtil
简介
BeanUtil
是 Hutool 提供的一个用于操作 Java Bean 的工具类。它提供了将 Bean 对象与 Map 互相转换、Bean 属性注入、Bean 属性复制等功能,简化了 Java 开发中对 Bean 的常见操作。
使用场景
- Bean 和 Map 之间的转换:例如在 Web 开发中,表单数据常以 Map 形式传递,需要将其转换为具体的 Bean。
- 属性复制:在 DTO、VO、PO 之间进行属性复制,减少冗余代码。
- 灵活的字段映射和别名:通过注解或配置实现灵活的字段映射,适应不同的字段命名规范。
# 1. 判断是否为 Bean 对象
BeanUtil.isBean
方法用于判断一个类是否是 Bean 对象。判断标准是:是否存在至少一个参数的 setXXX
方法。
# 示例:判断是否为 Bean 对象
import cn.hutool.core.bean.BeanUtil;
public class BeanExample {
public static void main(String[] args) {
boolean isBean = BeanUtil.isBean(HashMap.class);
System.out.println("HashMap 是否为 Bean: " + isBean); // false
}
}
2
3
4
5
6
7
8
关键点:
BeanUtil.isBean(Class<?> clazz)
:判断类是否为 Bean。
作用:用于在框架或工具类中判断类的类型,从而决定如何处理该对象。
# 2. Bean 属性注入
BeanUtil.fillBean
方法是 Bean 注入的核心方法,通过 ValueProvider
接口灵活获取属性值,并将其注入到指定 Bean 中。可以通过 CopyOptions
配置注入时的选项。
# 示例:Bean 属性注入
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.bean.copier.ValueProvider;
import lombok.Data;
@Data
class Person {
private String name;
private int age;
}
public class BeanExample {
public static void main(String[] args) {
Person person = BeanUtil.fillBean(new Person(), new ValueProvider<String>() {
@Override
public Object value(String key, Class<?> valueType) {
switch (key) {
case "name":
return "张三";
case "age":
return 18;
default:
return null;
}
}
@Override
public boolean containsKey(String key) {
return true;
}
}, CopyOptions.create());
System.out.println(person.getName()); // 张三
System.out.println(person.getAge()); // 18
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
关键点:
ValueProvider
:用于灵活获取属性值的接口,支持自定义数据来源。CopyOptions
:用于配置属性复制的选项,如是否忽略空值、属性映射等。
作用:在属性来源不固定或需要动态处理时,可以使用该方法进行 Bean 注入。
# 3. 使用 Map 填充 Bean
BeanUtil.fillBeanWithMap
方法允许使用 Map 中的键值对填充 Bean,支持忽略大小写、字段映射等功能。
# 示例:使用 Map 填充 Bean
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import java.util.Map;
@Data
class SubPerson {
private String name;
private int age;
}
public class BeanExample {
public static void main(String[] args) {
Map<String, Object> map = CollUtil.newHashMap();
map.put("name", "李四");
map.put("age", 25);
SubPerson person = BeanUtil.fillBeanWithMap(map, new SubPerson(), false);
System.out.println(person.getName()); // 李四
System.out.println(person.getAge()); // 25
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
关键点:
BeanUtil.fillBeanWithMap(Map<String, Object> map, T bean, boolean ignoreCase)
:使用 Map 填充 Bean,支持忽略大小写。
作用:在处理表单数据或 JSON 数据时,通常需要将 Map 转换为具体的 Bean。
# 4. Bean 转 Map
BeanUtil.beanToMap
方法可以将 Bean 转换为 Map,方便在某些场景下进行灵活的数据操作。
# 示例:Bean 转 Map
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import java.util.Map;
@Data
class SubPerson {
private String name;
private int age;
}
public class BeanExample {
public static void main(String[] args) {
SubPerson person = new SubPerson();
person.setName("测试用户");
person.setAge(30);
Map<String, Object> map = BeanUtil.beanToMap(person);
System.out.println(map); // {name=测试用户, age=30}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
关键点:
BeanUtil.beanToMap(Object bean)
:将 Bean 转换为 Map。
作用:在需要将 Bean 数据以 Map 形式传递或操作时非常有用。
# 5. Bean 属性复制
BeanUtil.copyProperties
方法可以将一个 Bean 的属性复制到另一个 Bean 中,支持自定义复制选项和字段映射。
# 示例:Bean 属性复制
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
@Data
class SourceBean {
private String name;
private int age;
}
@Data
class TargetBean {
private String name;
private int age;
}
public class BeanExample {
public static void main(String[] args) {
SourceBean source = new SourceBean();
source.setName("张三");
source.setAge(20);
TargetBean target = new TargetBean();
BeanUtil.copyProperties(source, target);
System.out.println(target.getName()); // 张三
System.out.println(target.getAge()); // 20
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
关键点:
BeanUtil.copyProperties(Object source, Object target)
:将源 Bean 的属性复制到目标 Bean 中。
作用:在 DTO、VO、PO 之间进行属性转换时非常实用。
# 6. 自定义别名 - @Alias
Hutool 提供了 @Alias
注解,用于定义 Bean 字段的别名,可以在字段名称不一致时使用别名进行映射。
# 示例:使用 @Alias
注解
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.annotation.Alias;
import lombok.Getter;
import lombok.Setter;
import java.util.Map;
@Getter
@Setter
class PersonWithAlias {
@Alias("aliasName")
private String name;
private int age;
}
public class BeanExample {
public static void main(String[] args) {
Map<String, Object> map = MapUtil.newHashMap();
map.put("aliasName", "别名用户");
map.put("age", 28);
PersonWithAlias person = BeanUtil.mapToBean(map, PersonWithAlias.class, false);
System.out.println(person.getName()); // 别名用户
System.out.println(person.getAge()); // 28
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
关键点:
@Alias
:用于定义字段的别名,在字段名不一致时进行映射。
作用:在字段名不一致或需要处理字段映射时非常有用,特别是在跨系统、跨平台数据传输时。
总结
BeanUtil
是一个功能强大且灵活的工具类,适用于各种 Bean 与 Map 的转换、属性复制、数据映射等操作。在实际开发中,你可以利用 BeanUtil
提高代码的简洁性和可维护性。