/**
* 对象的属性值拷贝
* <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. JavaScript数据类型 Math对象详解

    前言 javascript使用算术运算符实现基本的算术运算,如果要实现更加复杂的算术运算,需要通过Math对象定义的常量和函数来实现.和其他对象不同,Math只是一个静态对象,并没有Math()构造函 ...

  2. Java使用POI解析Excel表格

    概述 Excel表格是常用的数据存储工具,项目中经常会遇到导入Excel和导出Excel的功能. 常见的Excel格式有xls和xlsx.07版本以后主要以基于XML的压缩格式作为默认文件格式xlsx ...

  3. 在Windows Server上安装ASP.NET时失败,提示not enough storage is available to process the command

    今天在部署ASP.NET网站时出现IIS 500.21错误.环境是Windows Server 2012 +IIS8 于是查找解决方案,发现网上的信息都说是需要重装.NET framerwork4.0 ...

  4. robotframework环境安装

    1.安装 robotframework 执行命令 pip install robotframework 2.安装seleniumlibrary 执行命令 pip install --upgrade r ...

  5. 将base64转为图片

    void Base64StringToImage(string imgCode) { try { String inputStr = imgCode; byte[] arr = Convert.Fro ...

  6. Python django解决跨域请求的问题

    解决方案 1.安装django-cors-headers pip3 install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS = [ . ...

  7. selenium采用xpath方法识别页面元素

    有些HTML页面中的元素中属性较少,经常有找不到id.class.name等常用属性的时候,这个时候xpath.css就能很好的识别到我们的元素. Firefox和chrome浏览器中均有xpath. ...

  8. redis集群伸缩【转】

    一:实验介绍 在不影响集群对外服务的情况下,可以为集群添加节点进行扩容,也可以下线部分节点进行缩容. 原理可以抽象为槽和对应数据在不同节点之间灵活移动. 如果希望加入一个节点来实现集群扩容时,需要通过 ...

  9. 【easy】784. Letter Case Permutation

    Examples: Input: S = "a1b2" Output: ["a1b2", "a1B2", "A1b2", ...

  10. goroute应用-模拟远程调用RPC

    go语言简单模拟RPC,详见个人新博客:blog.dlgde.cn 代码如下: package main import ( "errors" "fmt" &qu ...