例如:
class ClassA{
private String name;
private Integer age;
private List<C> cList;
Private D d;
省略 setter,getter
}
class ClassB{
private String differentName;
private Integer differentAge;
private List<C> differCList;
private D differD;
省略 setter,getter
}
1
chendy 2023-11-14 08:55:16 +08:00 3
楼主这是提了个问题么?
不依赖其他库,不考虑不同类型,最简单实现就是弄个 map 保存字段映射关系,然后处理 然后伴随着业务的发展,不同类型需要处理,部分字段需要忽略,每次反射拿字段拿方法效率不行要缓存…最后就自己实现了一个 copy 库 |
2
zero47 2023-11-14 09:03:24 +08:00
让 A 给 B 做构造入参
|
3
zhangqian99 OP @chendy 想写一个工具类,使用注解的方式,有没有好的思路
|
4
aosan926 2023-11-14 09:09:31 +08:00
参考序列化与反序列化?
|
5
jsboy 2023-11-14 09:10:17 +08:00
java 的话,直接 mapstruct 吧,别重复造轮子了。
|
6
sumarker 2023-11-14 09:10:35 +08:00 1
不管是怎样映射关系总是需要维护的:
1.通过自定义注解,写在属性上,然后反射解析到对应的类属性上 2.搞一个中间类处理 3. 把映射关系,存在 xml 或者数据库里 |
7
dc2002007 2023-11-14 09:16:58 +08:00
搞 java 的总是喜欢把一些很简单的东西提出来讨论
|
8
looo 2023-11-14 09:36:45 +08:00
写这代码,还不如老老实实去手动 get set 装个插件一件生成 set 方法。
搞 copy 都是脱裤子放屁💨,有那时间早 set 好了。 |
9
theniupa 2023-11-14 09:41:02 +08:00
有那时间早 set 好了+1
|
10
SirYuxuan 2023-11-14 09:43:56 +08:00 1
```
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface PropertyMapping { String value(); } ``` ``` import java.lang.reflect.Field; public class BeanMapper { public static void copyProperties(Object source, Object destination) { Class<?> sourceClass = source.getClass(); Class<?> destClass = destination.getClass(); Field[] sourceFields = sourceClass.getDeclaredFields(); for (Field sourceField : sourceFields) { if (sourceField.isAnnotationPresent(PropertyMapping.class)) { String sourceFieldName = sourceField.getName(); String destinationFieldName = sourceField.getAnnotation(PropertyMapping.class).value(); try { Field destField = destClass.getDeclaredField(destinationFieldName); sourceField.setAccessible(true); destField.setAccessible(true); Object value = sourceField.get(source); destField.set(destination, value); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); // 处理异常,可以根据实际情况进行调整 } } } } } ``` |
11
Plutooo 2023-11-14 09:45:32 +08:00
重复造的轮子对比 mapstruct 有什么优势呢
|
12
SirYuxuan 2023-11-14 09:47:56 +08:00
不太明白为啥一点技术的氛围都没有呢,都会说在造轮子,up 说不定只是想学习一下实现的思路呢,技术无罪
|
13
zhangqian99 OP @Plutooo 这个是外包项目,在甲方虚拟机离线环境下编程,没有办法
|
14
yazinnnn0 2023-11-14 10:32:48 +08:00
|
15
yazinnnn0 2023-11-14 10:35:08 +08:00
另外, 离线开发都没有给 mvn 仓库镜像吗? 难道要手搓 framework?
|
16
Navee 2023-11-14 10:45:41 +08:00 1
'''java
class ClassA{ private String name; private Integer age; private List<C> cList; Private D d; public ClassA(ClassB classB){ ClassA a = new ClassA(); //映射逻辑 return a; } 省略 setter,getter } class ClassB{ private String differentName; private Integer differentAge; private List<C> differCList; private D differD; public ClassB(ClassA classA){ ClassB b = new ClassB(); //映射逻辑 return b; } 省略 setter,getter } ''' |
17
chendy 2023-11-14 10:46:50 +08:00
@zhangqian99 #3 那你好像已经把答案说出来了…
注解的方式不一定最优,因为需要处理的逻辑量更大,如果要转换的东西本来就不多,那直接反射更方便 其实还有一些办法比如生成 get set 代码之类的,差别其实不大 另外如果是甲方离线环境…如果有入口的话直接把 mapstruct 或者其他库的 jar 包传进去配到依赖里也行 |
18
lyxeno 2023-11-14 11:29:46 +08:00
get set 好了,方便 IDE 重构和分析。
|
19
gabon 2023-11-14 13:17:58 +08:00 via iPhone
不要用反射,离线环境考虑把 mapstruct 的 jar 包打到 classpath 里
|
20
xuanbg 2023-11-14 13:25:31 +08:00
通用的话就是加注解,然后自己写个静态方法调用就成。
|
21
jorneyr 2023-11-14 13:49:07 +08:00
自己实现一个工具,不就是不依赖其他库了么。
|
22
allecnm 2023-11-14 14:33:34 +08:00
get set 就行了呗
|