用java将一个对象镜像到另一个对象



有两个不同的类:A和B。它们有完全相同的字段名。假设他们的定义如下:

import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class A {
private String attriA;
private String attriB;
private String attriC;
}
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class B {
private String attriA;
private String attriB;
private String attriC;
}

假设我有一个A的实例,objectA,我想把它翻译成B。通过所有的手动操作,它看起来像:

B objectB = B.builder()
.attriA(objectA.getAttriA())
.attriB(objectA.getAttriB())
.attriC(objectA.getAttriC())
.build();

问题:

我好像在重复那些二传手。有没有什么图书馆或方法可以让我不必写那些重复的setter?感觉我们可以使用反思,但不知道具体如何。

一般来说,java坚持名义类型而不是结构类型的概念。为了将这个论点带回家,想象一下这两个接口:

public interface Camera {
public void shoot(Person target);
}
public interface Gun {
public void shoot(Person target);
}

在结构语言中,有人会有一个非常、非常的令人讨厌的惊喜。在名义语言中,这不是一个问题(请注意,类型是完全同名的-它们有一个包名,意思是,即使有同音异义词,你也不会遇到任何问题。java.util.Listjava.awt.List在java生态系统中的任何地方都不可交换。Guns和Grandmas(。

类似的原理也适用于此:A可能看起来很像B,但在java中,A不是B。事实上,A的"attriA"字段与B的"attryA"字段绝对没有任何关系。事实上,他们碰巧有相同的名字和类型,这纯属巧合。实际上,它是一个实现细节(私有的API(;您应该能够重命名字段,并且现有的任何代码都不应该关心这一点,或者中断。

因此,你不应该想要这样;这不是java风格。

但如果你坚持,MapStruct可能会在这里为你做点什么(不过我不推荐它!(。

由于AB除了听起来完全相同的属性之外似乎没有任何共同点,至少你没有说它们是相互继承的,所以你可以编写自己的mapper方法或函数。然后,只要您想从A创建B,就可以调用此函数,并省去一些键入:

Function<A,B> mirrorToB = a ->  B.builder()
.attriA(objectA.getAttriA())
.attriB(objectA.getAttriB())
.attriC(objectA.getAttriC())
.build();
B objectB = mirrorToB.apply(objectA);

在Apache的BeanUtils中,您正期待着一件事。https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils/1.9.2

BeanUtils.copyProperties(objectB, objectA);

最新更新