DynaBean 工具类
# DynaBean 工具类
介绍
DynaBean
是 Hutool 提供的一个封装类,用于通过反射机制动态操作 JavaBean。通过 DynaBean
,可以通过字段名称动态调用 get
和 set
方法,也可以动态创建 JavaBean 对象,甚至执行 JavaBean 中的方法。它的主要作用是将 JavaBean 转换为一种类似于 Map
的操作方式,从而实现更加灵活的动态操作。
使用场景
- 动态属性注入:在框架开发中,可能需要对未知属性的 JavaBean 进行动态赋值。
- 通用工具封装:将业务代码中的 JavaBean 操作统一封装,简化代码逻辑。
- 灵活的属性获取和设置:在数据转换和处理时,避免编写大量重复的
get
和set
方法调用。
# 1. 创建 DynaBean
# 示例:创建 DynaBean
import cn.hutool.core.bean.DynaBean;
import lombok.Data;
@Data
class User {
private String name;
private int age;
public String testMethod() {
return "test for " + this.name;
}
}
public class DynaBeanExample {
public static void main(String[] args) {
User user = new User();
DynaBean bean = DynaBean.create(user);
// 通过反射构造对象
DynaBean bean2 = DynaBean.create(User.class);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
关键点:
DynaBean.create(Object bean)
:通过现有的 JavaBean 创建DynaBean
实例。DynaBean.create(Class<?> beanClass)
:通过类类型创建DynaBean
实例。
作用:用于将 JavaBean 包装为 DynaBean
,以便后续操作。
# 2. 动态设置和获取属性
通过 DynaBean
可以像操作 Map
一样动态地设置和获取 JavaBean 的属性。
# 示例:动态设置和获取属性
import cn.hutool.core.bean.DynaBean;
import lombok.Data;
@Data
class User {
private String name;
private int age;
}
public class DynaBeanExample {
public static void main(String[] args) {
User user = new User();
DynaBean bean = DynaBean.create(user);
// 动态设置属性
bean.set("name", "李华");
bean.set("age", 12);
// 动态获取属性
String name = bean.get("name");
int age = bean.get("age");
System.out.println("姓名: " + name); // 输出: 姓名: 李华
System.out.println("年龄: " + age); // 输出: 年龄: 12
}
}
1
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
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
关键点:
bean.set(String property, Object value)
:通过属性名称动态设置属性值。bean.get(String property)
:通过属性名称动态获取属性值。
作用:在需要动态操作属性或在不知道具体字段名称的情况下,非常实用。
# 3. 调用方法
DynaBean
还可以通过 invoke
方法调用 JavaBean 中的任意方法。
# 示例:调用方法
import cn.hutool.core.bean.DynaBean;
import lombok.Data;
@Data
class User {
private String name;
private int age;
public String testMethod() {
return "test for " + this.name;
}
}
public class DynaBeanExample {
public static void main(String[] args) {
User user = new User();
user.setName("李华");
DynaBean bean = DynaBean.create(user);
// 调用方法
Object result = bean.invoke("testMethod");
System.out.println(result); // 输出: test for 李华
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
关键点:
bean.invoke(String methodName, Object... args)
:调用指定的方法,支持传入方法参数。
作用:在需要动态执行 JavaBean 中的方法时非常有用,避免硬编码。
# 4. 默认方法支持
DynaBean
默认实现了 hashCode
、equals
和 toString
三个方法,这些方法会调用原对象的相应方法,确保封装后的对象行为一致。
# 示例:默认方法支持
import cn.hutool.core.bean.DynaBean;
import lombok.Data;
@Data
class User {
private String name;
private int age;
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
public class DynaBeanExample {
public static void main(String[] args) {
User user = new User();
user.setName("李华");
user.setAge(12);
DynaBean bean = DynaBean.create(user);
// 调用 toString 方法
System.out.println(bean.toString()); // 输出: User{name='李华', age=12}
}
}
1
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
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
作用:保证了在封装后的 DynaBean
对象中,原有的 hashCode
、equals
和 toString
行为不变。
总结
DynaBean
是一个灵活且强大的工具,适用于需要动态操作 JavaBean 属性和方法的场景。它封装了复杂的反射逻辑,使得开发者可以像操作 Map
一样操作 JavaBean,从而大大提高了代码的灵活性和可维护性。
- 动态属性注入:适用于框架开发、数据处理。
- 灵活调用方法:在某些通用工具类中,可以通过
DynaBean
实现通用方法调用。 - 适用于反射封装场景:避免手动编写大量反射代码,简化逻辑。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08