将source类中的属性值赋给target类中对应的属性

/**
     * 对象的属性值拷贝
     * <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();
        }
    }

原文地址:https://www.cnblogs.com/du001011/p/10778133.html

时间: 2024-07-31 15:56:51

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

js中的innerText、innerHTML、属性值、value与jQuery中的text()、html()、属性值、val()总结

js与jQuery获取text.html.属性值.value的方法是不一样的. js与jQuery,text与innerText获取(<!---->中为结果) html: <p id="test">这是段落中的 <b>粗体</b> 文本.</p> <button id="btn10">jQuery显示text</button> <!--Text: 这是段落中的 粗体 文本.--

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

实体类 class Product { public string Id { get; set; } public string Name { get; set; } public List<ProductDetail> Detail { get; set; } public List<ProductComment> Comment { get; set; } } class ProductDetail { public string DtlId { get; set; } pub

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

package zuoye8; public abstract class Shape { private double zhouchang ; private double mianji ; public Shape(double zhouchang, double mianji) { super(); this.zhouchang = zhouchang; this.mianji = mianji; } public Shape() { super(); } //抽象一个周长方法 publi

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

package shape; public class Shape { //定义成员变量 private double zhouchang; private double mianji; public double getZhouchang() { return zhouchang; } public void setZhouchang(double zhouchang) { this.zhouchang = zhouchang; } public double getMianji() { re

字符串转换成类,字符串的值是事先声明类的

============问题描述============ 现在就是有一个字符串,例如temp,然后我想通过Intent intent = new Intent(Schedule.this,temp.class);转到temp页面,事先是已经声明好temp类的,怎么做啊 ============解决方案1============ try         String temp="package.classname";         Intent intent=new Intent();

用反射写的取属性值和设置属性值得方法

1 package com.lovo.util; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 6 public class MyUtil { 7 private MyUtil(){ 8 throw new AssertionError(); 9 } 10 /** 11 * 通过反射获取对象的字段值 12 * @param target 目标对象 13 * @param fieldNam

java中循环遍历实体类的属性和数据类型以及属性值

package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Date; /*** * 遍历实体类的属性和数据类型以及属性值 * * @author LiBaozhen * @date 2013-1-4 上午10:25:02 * @co

关于Javascript中通过实例对象修改原型对象属性值的问题

Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的说就1种,即Object类型.往细的说有:Object类型.Array类型.Date类型.Regexp类型.Function类型等. 当原型对象的属性值为基本类型的数据值时,通过实例对象修改属性值从而引起原型对象的属性值发生变化的情况不会发生.当原型对象的属性值为引用类型的数据值时,通过实例对象修改

ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现

在"ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现"中,在控制台应用程序中实现了属性值的笛卡尔乘积.本篇在界面中实现.需要实现的大致如下: 在界面中勾选CheckBoxList中属性值选项: 把勾选的属性值进行笛卡尔乘积,每行需要填写价格: 我们暂且不考虑这些CheckBoxList是如何显示出来的(在后续有关商品模块的文章中会实现),还需考虑的方面包括: 1.从CheckBoxList中获取到什么再往控制器传? 对于每行的CheckBoxList来说