java一个对象赋值给另一个对象,支持平铺类和层级类间的互转

场景:将一个层级类对象(领域驱动model对象)转换为平铺类对象(view)

src对象,(红框为子对象)

target对象(平铺对象)

代码思路,先递归反射遍历出所有字段,存到一个map里,再递归赋值给target对象

缺陷:不同子对象间的同名字段会被覆盖成一个值

代码

private static void getSrcALLFieldMap(Object obj,Map<String,Object> collectMap){
        Class srcClazz = obj.getClass();
        Field[] srcFields = srcClazz.getDeclaredFields();
        Stream.of(srcFields).forEach(field -> {
            field.setAccessible(true);
            try {
                if(field.getType().toString().contains("aacoin.account")  && !field.getType().isEnum()){
                    Object subObj = field.get(obj);
                    if(subObj!=null)
                        getSrcALLFieldMap(subObj,collectMap);
                }else{
                    collectMap.put(field.getName(),field.get(obj));
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        });
    }
    private static void setTargetAllField(Object obj, Map<String,Object> srcMap){
        Class srcClazz = obj.getClass();
        Field[] srcFields = srcClazz.getDeclaredFields();
        Stream.of(srcFields).forEach(field -> {
            field.setAccessible(true);
            try {
                if(field.getType().toString().contains("aacoin.trade.otc") && !field.getType().isEnum()){
                    Object subObj = field.get(obj);
                    if(subObj == null) {
                        Constructor cons = field.getType().getDeclaredConstructor(null);
                        cons.setAccessible(true);
                        subObj = cons.newInstance(null);
                        field.set(obj, subObj);
                    }
                    setTargetAllField(subObj, srcMap);
                }else{
                    //collectMap.put(field,obj);
                    Object currentField = srcMap.get(field.getName());
                    if( currentField !=null && field.getType() == currentField.getClass()){
                        field.set(obj,currentField);
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        });
    }

    public static <T> T convert(Object src,Class<T> tClass){

        Constructor<T> cons = null;
        try {
            cons = tClass.getDeclaredConstructor(null);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        cons.setAccessible(true);
        T result = null;
        try {
            result = cons.newInstance(null);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        convert(src,result);
        return result;
    }

    public static <T> T convert(Object src,T result) {

        Map<String,Object> srcMap = new HashMap();
        getSrcALLFieldMap(src,srcMap);

        setTargetAllField(result,srcMap);
        return result;
    }

调用:

adverVO =convert(advert,AdvertVO.class);

写的比较随意,直接吞掉了异常,需自行处理,将异常统一规范抛出

原文地址:https://www.cnblogs.com/cmos/p/9104384.html

时间: 2024-08-06 19:21:45

java一个对象赋值给另一个对象,支持平铺类和层级类间的互转的相关文章

Openbox简单支持平铺

使用和gnome shell同样的热键定义 rc.xml中 <keybind key="W-Up"> <action name="Maximize"/> </keybind> <keybind key="W-Down"> <action name="Unmaximize"/> </keybind> <keybind key="W-Left&

js 对象操作 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象

我最近在做一个vue + element-UI + vue-resource + vuex项目的时候,遇到了一个对象的问题. 当我们在项目需要 复制一个对象到另一个对象并且  被复制的对象不能受复制后的对象的影响. 我先总结下 我们哪些方法可以复制对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // 直接赋值 var obj1 = { a: 1 }; var obj2 = obj1; console.log(obj2)

Java数组赋值

String [] word = {"hello", "world", "java"}; String [] dest = new String[3]; dest = words; words[0] = "nihao"; for(String t: dest){ System.out.println(t); } String [] dest2 = {"12","23","34&

java jdbc ResultSet结果通过java反射赋值给java对象

在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. 因为很多情况下数据不止一条,所以返回的是对象类的一个集合. 需要注意的地方:在这里,数据库字段命名格式为:user_name 下划线格式,而java类型的命名格式为驼峰命名格式. 具体代码如下: package com.xc.sap.util; import java.sql.Connection;

java 类的匿名类和封装

/* 匿名对象:没有引用类型变量指向的对象称作为匿名对象. 需求: 使用 java类描述一个学生类. 匿名对象要注意的事项: 1. 我们一般不会给匿名对象赋予属性值,因为永远无法获取到. 2. 两个匿名对象永远都不可能是同一个对象. 匿名对象好处:简化书写.可以尽快释放对象的堆内存空间 匿名对象的应用场景: 1. 如果一个对象需要调用一个方法一次的时候,而调用完这个方法之后,该对象就不再使用了,这时候可以使用 匿名对象. 2. 可以作为实参调用一个函数. */ //学生类 class Stude

黑马程序员——Java基础---反射Class类、Constructor类、Field类

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 反射的应用场景 一.概述 反射技术: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的

java中String类、StringBuilder类和StringBuffer类详解

本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html 版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利 正文: 探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得

JAVA不可变类与可变类、值传递与引用传递深入理解

一个由try...catch...finally引出的思考,在前面已经初步了解过不可变与可变.值传递与引用传递,在这里再次深入理解. 1.先看下面一个try..catch..finally的例子: Person.java package cn.qlq.test; public class Person { private int age; private String name; public int getAge() { return age; } public void setAge(int

创建java类并实例化类对象

创建java类并实例化类对象例一1.面向对象的编程关注于类的设计2.设计类实际上就是设计类的成员3.基本的类的成员,属性(成员变量)&方法 面向对象思想的落地法则一:1.设计类,并设计类的成员(成员变量&成员方法)2.通过类,来创建类的对象(也称作类的实例化) public class zoo { public static void main(String[] args) { //基本数据类型的声明,数据类型 变量名=初始化值 //类的实例化:如a1就是一个对象 Animal a1=ne