/**
* 对象的属性值拷贝
* <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. Tomcat系列(1)——Tomcat安装配置

    核心步骤 1. 安装JAVA(因为tomcat依赖于java) 配置:JAVA_HOME D:\Program Files (x86)\Java\jdk1.7.0 path  %JAVA_HOME%\ ...

  2. 如何解决Java警告信息:"objc[31336]: Class JavaLaunchHelper is implemented in both places ..."

    在macOS High Sierra Version 10.13.6下使用Intellij在Java 8上执行Java程序,console中会打印如下警告信息: objc[31336]: Class ...

  3. HDU - 3035 War(对偶图求最小割+最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3035 题意 给个图,求把s和t分开的最小割. 分析 实际顶点和边非常多,不能用最大流来求解.这道题要用 ...

  4. 第二节:SSL证书的申请、配置(IIS通用)及跳转Https请求的两种方式

    一. 相关概念介绍 1. SSL证书服务 SSL证书服务由"服务商"联合多家国内外数字证书管理和颁发的权威机构.在xx云平台上直接提供的服务器数字证书.您可以在阿里云.腾讯云等平台 ...

  5. nginx资料汇总

    nginx docker 中的一些目录和 windows下是不同的, 静态内容目录: /usr/share/nginx/html 配置文件目录: /etc/nginx 日志输出目录: /var/log ...

  6. 一秒钟带你走进P图世界-----(python)PIL库的使用

    python-----PIL库的使用 一.什么是PIL库 1.PIL(Python Image Library)库是python语言的第三方库,具有强大的图像处理能力,不仅包含了丰富的像素.色彩操作功 ...

  7. (八)python中的函数

    一.聊聊函数 1.什么是函数? 上学时我记得最简单的是 F=x+y 这是一个简单的函数,看看python 中的格式 def test(): #函数定义 def 万年不变 print("> ...

  8. Writage让你的Word支持Markdown

    Writage 简单的执行后,word就可以在保存或打开的时候支持Markdown了!

  9. js中的 Date对象 在 IOS 手机中的兼容性问题

    项目中有个时间相关的需求,很自然的用到了 js 中的 new Date() 获取时间,浏览器使用模拟手机模式访问没有问题,但是真机测试时发现,ios系统的手机无法显示时间. 定位问题发现是 new D ...

  10. Jmeter、Postman 、 loadrunner SoapUI 接口测试工具

    一. loadrunner  简称 LR 二. Jmeter 1.安装包:apache-jmeter-4.0.tgz   解压.学会此工具的使用  和POSTman 一样的. 2.本机测试:双击apa ...