/**
* 对象的属性值拷贝
* <p>
* 将source对象中的属性值赋值到target对象中的属性,属性名一样,类型一样
* <p>
* example:
* <p>
* source:
* <p>
* String name;
* String address;
* Integer age;
* Date birthday;
* <p>
* target:
* String name;
* String address;
* String email
* <p>
* 结果: source name, address -> target name, address
*
* @param source
* @param target
*/

思路:三步走,

第一步:获取source和target的全部属性,放入List集合中(为什么要放入List集合中,为了偷懒而已,大可以不放就是多写一层循环而已);

第二步:比较两个类中属性名是否相等,相等的话,执行第三步,不相等,继续遍历,直到遍历结束;

第三步:判断属性的类型是否相同,相同赋值,不相同继续遍历,直到遍历结束

代码如下:

public static void copy(Object s, Object t) {
//TODO
List<String> list_s = new ArrayList<>();
List<String> list_t = new ArrayList<>();
//获取s的Class对象
Class clss = s.getClass();
//获取t的Class对象
Class clst = t.getClass();
//获取s中所有属性,并加入到集合list_s中
Field[] fields = clss.getDeclaredFields();
for(Field ff : fields){
list_s.add(ff.getName());
}
//获取t中所有属性,并加入到集合list_t中
Field[] fieldt = clst.getDeclaredFields();
for(Field ff : fieldt){
list_t.add(ff.getName());
}
//遍历list_t集合,在list_s集合中查找是否含有t的属性,包含判断属性类型是否相同,相同赋值
for(String ss : list_t){
if(list_s.contains(ss)&&isEqualFieldType(s,t,ss)){
sCopyt(s,t,ss);
}
} }
//判断二者属性类型是否相同
public static boolean isEqualFieldType(Object o1,Object o2,String s){
Class cls1 = o1.getClass();
Class cls2 = o2.getClass();
try {
Field f1 = cls1.getDeclaredField(s);
Field f2 = cls2.getDeclaredField(s);
if(f1.getType().getName().equals(f2.getType().getName())){
return true;
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return false; }
//将s中的属性值赋给t的属性值
public static void sCopyt(Object o1,Object o2,String s){
Class cls1 = o1.getClass();
Class cls2 = o2.getClass();
try {
      //获取对应的属性对象
Field f1 = cls1.getDeclaredField(s);
Field f2 = cls2.getDeclaredField(s);
      //设置可见性
f1.setAccessible(true);
f2.setAccessible(true);
      //利用get和set方法进行赋值
f2.set(o2,f1.get(o1));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}

将source类中的属性值赋给target类中对应的属性的更多相关文章

  1. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_8 Mybatis中的返回值深入-调整实体类属性解决增和改方法的报错

    如果实体类和数据库表内的字段没有保持一致 修改了属性子弹. 重新生成getter和setter还有toString方法 测试类里面,相关set的方法就都会报错. 只需要修改为最新的set方法就可以了. ...

  2. 用泛型方法Java从实体中提取属性值,以及在泛型方法中的使用

    public <T> T getFieldValue(Object target, String fieldName, Class<T> typeName) { try { O ...

  3. SpringMVC(六):@RequestMapping下使用@RequestHeader绑定请求报头的属性值、@CookieValue绑定请求中的Cookie值

    备注:我本地浏览器的报头(Request Header)信息如下: Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image ...

  4. C# 反射获取属性值、名称、类型以及集合的属性值、类型名称

    实体类 class Product { public string Id { get; set; } public string Name { get; set; } public List<P ...

  5. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_9 Mybatis中的返回值深入-解决实体类属性和数据库列名不对应的两种方式

    sql语句里面起别名的方式 测试查询的方法 数据字段 都有值了. 配置查询接口列表和实体类属性名对应关系 id可以随便起名 主键的对应 再次测试,并没有封装成功 这是应为定义的对应关系并没有使用. 当 ...

  6. 30.编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。

    package zuoye8; public abstract class Shape { private double zhouchang ; private double mianji ; pub ...

  7. 编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。

    package shape; public class Shape { //定义成员变量 private double zhouchang; private double mianji; public ...

  8. 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量

    原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为   aB , 驼峰命名就可以了.

  9. python 3.6闭包+循环获取出字典中所有的值并保存在list中

    def list_test(): list1=[] def list_all_dict(a): #检测字段类型 if isinstance(a,dict): for x in range(len(a) ...

随机推荐

  1. 第二周博客作业<西北师范大学|李晓婷>

    1.助教博客链接:https://home.cnblogs.com/u/lxt-/ 2.点评作业内容: https://www.cnblogs.com/dxd123/p/10494907.html#4 ...

  2. 路径分隔符不一致,导致windows下不能开发

    最近想要基于YAPI扩展开发一个自己的API管理平台,但是发现在windows下直接跑会报错,在Mac跑就没事 报的错是: Uncaught TypeError: $export is not a f ...

  3. HBase读写的几种方式(二)spark篇

    1. HBase读写的方式概况 主要分为: 纯Java API读写HBase的方式: Spark读写HBase的方式: Flink读写HBase的方式: HBase通过Phoenix读写的方式: 第一 ...

  4. 永续公债(or统一公债)的麦考利久期(Macaulay Duration)的计算

  5. [算法竞赛入门经典] 象棋 ACM/ICPC Fuzhou 2011, UVa1589 较详细注释

    Description: Xiangqi is one of the most popular two-player board games in China. The game represents ...

  6. Response.Write()方法响应导致页面字体变大的解决办法

    关于ASP.NET中用Response.Write()方法响应导致页面字体变大的解决办法     最近研究了ASP.NET,发现一个问题,比方说在页面里面有个Button,要点击以后要打开新窗口,而且 ...

  7. 中国 A 股纳入 MSCI

    1 .什么是 MSCI MSCI 是美国指数编制公司 --- 美国明晟公司的简称. 是一家股权,固定资产,对冲基金,股票市场指数的供应商. MSCI 旗下编制了多种指数,他们把全球股票市场分成发达国家 ...

  8. html-webpack-plugin详解

    引言 我们来看看主要作用: 为html文件中引入的外部资源如script.link动态添加每次compile后的hash,防止引用缓存的外部文件问题 可以生成创建html入口文件,比如单页面可以生成一 ...

  9. Ueditor增加文字竖排显示和从右向左输入(支持蒙古文和维吾尔文)

    平时我们在ueditor中都是输入的中文,排版都是从左向右输入.但是当输入一些少数民民族言时,ueditor却不能正常显示. 例如蒙古文字,传统蒙文是竖排书写.如下图:传统蒙古文排文方式,<蒙古 ...

  10. IIS部署项目

    控制面板\所有控制面板项\管理工具-->Internet 信息服务(IIS)管理器 随便填个名称,项目的路径,选择一个新的端口.