java将一个对象赋值给另一个对象_java一个对象赋值给另一个对象,支持平铺类和层级类间的互转...
场景:将一个层级类对象(领域驱动model对象)转换为平铺类对象(view)
src对象,(红框为子对象)
target对象(平铺对象)
代码思路,先递归反射遍历出所有字段,存到一个map里,再递归赋值给target对象
缺陷:不同子对象间的同名字段会被覆盖成一个值
代码
private static void getSrcALLFieldMap(Object obj,Map 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 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 convert(Object src,Class tClass){
Constructor 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 convert(Object src,T result) {
Map srcMap = new HashMap();
getSrcALLFieldMap(src,srcMap);
setTargetAllField(result,srcMap);
return result;
}
调用:
adverVO =convert(advert,AdvertVO.class);
写的比较随意,直接吞掉了异常,需自行处理,将异常统一规范抛出
希望与广大网友互动??
点此进行留言吧!
java将一个对象赋值给另一个对象_java一个对象赋值给另一个对象,支持平铺类和层级类间的互转...相关推荐
- Java面对对象的核心是啥_Java面向对象核心技能
1.封装 封装是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问. 封装的好处:隐藏类的实现细节:让使用者只能通过程序规 ...
- .net 把一个对象赋值给一个参数_Java GC回收算法-判定一个对象是否可以回收
开源推荐 推荐一款一站式性能监控工具(开源项目) Pepper-Metrics是跟一位同事一起开发的开源组件,主要功能是通过比较轻量的方式与常用开源组件(jedis/mybatis/motan/dub ...
- java让对象分配在栈上_java – Hotspot何时可以在堆栈上分配对象?
我做了一些实验,以便了解Hotspot何时可以进行堆栈分配.事实证明,它的堆栈分配比基于available documentation的预期要有限得多.Choi"Escape Analysi ...
- java json 对象如何对属性排序_Java对象集合、对象数组如何排序?你需要知道这两种方式...
一.引子 在比较Java对象时,正常情况下,我们只能使用==或!=进行比较,而不能使用>或者<这样的运算符. 那么问题来了,开发过程中我们经常要对多个对象排序,排序必然需要比较,那么如何实 ...
- java未知对象调用其某个方法_java如何调用一个方法内的对象
我在调试一个小例子,自己改了些东西我在主类里尝试println下面一个方法里的对象的属性,但是提示找不到而且大家都是Public就是这句:System.out.println("m4.cou ...
- java 比较对象内容是否相同的_Java 比较对象中的内容是否一致
获取对象中的所有属性 private static Field[] getAllFields(Object object) { Class clazz = object.getClass(); Lis ...
- java 判断对象是否是xml格式_java对象与xml格式之间的转换
java对象是可以直接与xml相互转换的,但需要导入包:xstream-1.3.1.jar,在创建对象的时候,注意一定要new一个DomDriver: 成功的测试代码如下: package com.x ...
- Java将一个对象的属性值copy给另一个相同的对象
import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor;pub ...
- java对象赋值给另一个对象_java面向对象编程
对象,从字面意思来看就是我们面对的物象.由此便可以知道,万事万物皆为对象.比如:一台电脑,一辆汽车,一部手机等等都是对象. 比如我们想要买一部手机,我们想要内存大一点的,最新款的,CPU 运算快一点的 ...
最新文章
- 知乎如何运用OKR管理公司目标,达成绩效?
- 博客园的“随笔、文章、新闻、日记有啥区别”
- 第十一届全国大学生智能汽车竞赛获奖名单
- Python 进阶_生成器 生成器表达式
- php foreach方法,forEach方法怎么使用
- 深入浅出数据库设计三范式
- HDU.1003 Max Sum
- python docx 表格打印不显示_python-docx 设置 word 文档中表格格式
- html中设置锚点定位的几种常见方法
- Jackson 生成xml格式文件
- android listview 获取viewholder,Android ViewHolder 的基本使用
- android+cardview用法,Android CardView的使用
- 51单片机数码管静态显示
- 服务器导出excel文档,服务器导出excel功能配置
- AutoFill 自动填充生长动画插件
- Rancher2.6全新Monitoring快速入门
- 用 Python 运行神经网络
- 实力踩坑:There is no getter for property named ‘XXX‘ ‘class XXX‘
- 第十届蓝桥杯大赛PythonB组
- Day4 T2 卡牌游戏