把一个对象的值赋给另一个对象中对应的属性

当需要把一个对象的值赋给另一个对象中对应的属性时,写一大堆的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();
             }
         }
     }
}


点关注,不迷路

文章每周持续更新,可以微信搜索「 十分钟学编程 」第一时间阅读和催更,如果这个文章写得还不错,觉得有点东西的话 ~求点赞👍 求关注❤️ 求分享❤️ 
各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒋老湿

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值