在java中将一个对象镜像到另一个对象

在java中将一个对象镜像到另一个对象,java,reflection,dry,Java,Reflection,Dry,有两个不同的类:A和B。它们有完全相同的字段名。假设其定义如下: import lombok.Builder; import lombok.Data; @Data @Builder public class A { private String attriA; private String attriB; private String attriC; } 假设我有一个A的实例,objectA,我想把它翻译成B。通过所有的手工工作,它看起来像: B objectB=B.build

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

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class A {
  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.List
java.awt.List
在java生态系统中,在任何地方都不能以任何方式或形式互换。Guns和grammas)

类似的原则也适用于此:A可能看起来很像A B,但在java中,A不是A B。事实上,A的“attriA”字段与B的“attriA”字段完全没有任何关系。它们碰巧具有相同的名称和相同的类型,这完全是巧合。事实上,这是一个实现细节(私有API);您应该能够重命名该字段,现有的代码不应该关心这一点,也不应该中断

因此,您不应该想要它;它不是java风格的


但是如果您坚持,可能可以在这里为您做点什么(尽管我不推荐!)。

一般来说,java坚持名义类型而不是结构类型的概念。要让这一论点得到充分的理解,请想象以下两个接口:

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

public interface Gun {
    public void shoot(Person target);
}
在结构语言中,有人会有一个非常非常讨厌的惊喜。在名义语言中,这不是一个问题(请注意,类型是完全名称空间的——它们有一个包名,这意味着,即使使用同音词,您也不会遇到任何问题。
java.util.List
java.awt.List
在java生态系统中,在任何地方都不能以任何方式或形式互换。Guns和grammas)

类似的原则也适用于此:A可能看起来很像A B,但在java中,A不是A B。事实上,A的“attriA”字段与B的“attriA”字段完全没有任何关系。它们碰巧具有相同的名称和相同的类型,这完全是巧合。事实上,这是一个实现细节(私有API);您应该能够重命名该字段,现有的代码不应该关心这一点,也不应该中断

因此,您不应该想要它;它不是java风格的


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

由于
A
B
除了听起来一致的属性外似乎没有任何共同之处,至少您没有说它们是从彼此继承的,您可以编写自己的映射器方法或函数。然后,您可以随时调用此函数,只要您想从
A
创建
B
>并节省一些打字时间:

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

B objectB = mirrorToB.apply(objectA);
函数mirrorToB=a->B.builder()
.attriA(objectA.getAttriA())
.attriB(objectA.getAttriB())
.attriC(objectA.getAttriC())
.build();
B objectB=mirrorToB.apply(objectA);

由于
A
B
除了听起来相同的属性之外似乎没有任何共同之处,至少你没有说它们是从彼此继承的,你可以编写自己的映射器方法或函数。然后,当你想从
AB
时,你可以调用这个函数取消>并保存一些键入:

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

B objectB = mirrorToB.apply(objectA);
函数mirrorToB=a->B.builder()
.attriA(objectA.getAttriA())
.attriB(objectA.getAttriB())
.attriC(objectA.getAttriC())
.build();
B objectB=mirrorToB.apply(objectA);

在Apache的BeanUtils中,有一件事是您所期待的。


在Apache的BeanUtils中,有一件事是您所期待的。