当需要把一个对象的值赋给另一个对象中对应的属性时,写一大堆的get()和set()是很麻烦的事情,而且代码看起来会很丑。在项目中屡次接触过一个方法(函数),这个方法(函数)可以把一个对象中的值全部赋给另一个对象中对应的同名的属性,不同名的就无视了,很是方便。下面直接上代码看看其原理大概是个什么样子:
首先有两个对象,一个Form和一个DTO
Java code
?
1
2
3
4
5
6
7
8
9
10
|
public
class
CarForm {
public
String brand;
public
String type;
public
int
price;
public
int
count;
}
|
Java code
?
1
2
3
4
5
6
7
8
9
10
11
|
public
class
CarDto {
public
String brand;
public
String type;
public
int
price;
public
int
count;
public
String encribe;
}
|
然后写一个service类,用来模拟实现把表单提交的字符串转换成Form类的值
Java code
?
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import
java.lang.reflect.Field;
import
java.util.HashMap;
import
java.util.Map;
/**
* 模拟提交表单
* @author ...
*
*/
public
class
CarService {
public
CarForm submitForm(Object form, String values) {
//以&分隔开来
String[] keyValues = values.split(
"&"
);
Map<String, Object> valueMap =
new
HashMap<String, Object>();
for
(String s : keyValues) {
valueMap.put(s.substring(
0
, s.indexOf(
"="
)), s.substring(s.indexOf(
"="
) +
1
));
}
Field[] fds = form.getClass().getDeclaredFields();
String typeClass;
Object value;
for
(Field fd : fds) {
try
{
typeClass = fd.getType().getSimpleName();
value = valueMap.get(fd.getName());
//需要判断属性类型,
if
(typeClass.equals(
"int"
)) {
value = Integer.parseInt(value.toString());
}
if
(typeClass.equals(
"String"
)) {
value = value.toString();
}
fd.set(form, value);
}
catch
(Exception e) {
e.printStackTrace();
}
}
return
(CarForm) form;
}
}
|
然后就是Copy两个对象的属性值了
Java code
?
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
27
28
29
30
31
32
33
34
35
|
import
java.lang.reflect.Field;
import
java.util.HashMap;
import
java.util.Map;
/**
* 两个对象同名属性复制值
* @author chenglixiang
*
*/
public
class
Copys {
public
static
void
copy(CarForm src, CarDto dest) {
Map<String, Object> srcMap =
new
HashMap<String, Object>();
Field[] srcFields = src.getClass().getDeclaredFields();
for
(Field fd : srcFields) {
try
{
srcMap.put(fd.getName(), fd.get(src));
//获取属性值
}
catch
(Exception e) {
e.printStackTrace();
}
}
Field[] destFields = dest.getClass().getDeclaredFields();
for
(Field fd : destFields) {
if
(srcMap.get(fd.getName()) ==
null
) {
continue
;
}
try
{
fd.set(dest, srcMap.get(fd.getName()));
//给属性赋值
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
}
|
最后做个测试
Java code
?
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
|
import
java.lang.reflect.Field;
public
class
Test {
public
static
void
main(String[] args) {
//模拟提交表单的字符串
String values =
"brand=奥迪&type=A6&price=60&count=1000"
;
CarService carService =
new
CarService();
CarForm carForm =
new
CarForm();
carForm = carService.submitForm(carForm, values);
CarDto carDto =
new
CarDto();
Copys.copy(carForm, carDto);
carDto.encribe =
"详细说明详细说明"
;
Field[] fds = carDto.getClass().getDeclaredFields();
for
(Field fd : fds) {
try
{
System.out.println(fd.getName() +
"="
+ fd.get(carDto));
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
}
|
点关注,不迷路
文章每周持续更新,可以微信搜索「 十分钟学编程 」第一时间阅读和催更,如果这个文章写得还不错,觉得有点东西的话 ~求点赞👍 求关注❤️ 求分享❤️
各位的支持和认可,就是我创作的最大动力,我们下篇文章见!