在java中将一个对象镜像到另一个对象
有两个不同的类:A和B。它们有完全相同的字段名。假设其定义如下:在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
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中,有一件事是您所期待的。