我想知道以下情况是否可能。
有两个类(源和目标),在代码中我可以这样做:
public class Source{
private String fieldA;
private String fieldB;
public Source(){ ... }
}
...
public class Destination{
public Destination(Source src){ ... }
}
Source src = new Source();
Destination dest = new Destination(src);
dest.fieldA = "test";
dest.fieldB = "test";
所以我在这里的意思是我有两个类,一个称为 Source
包含(私有(private))字段,另一个称为 Destination
没有字段。创建这些类的两个对象并将 Source
传递到 Destination
的构造函数后,我希望能够复制/复制 Source
的字段> 进入 Destination
。
无论是否使用反射,这样的事情在 Java 中是否可行?如果可能的话,有人能给我一个小例子吗?
最佳答案
完成此操作的一个 hackish 版本是将所有字段添加到 Map
。可以将字段从源对象复制到目标对象,字段名称可以是键。类似这样的事情:
public class FieldAccessor {
public static class Destination {
private final Map<String, Object> fields = new HashMap<>();
public Destination(Object o) {
final Set<Field> accessibleFields = Arrays.stream(o.getClass().getDeclaredFields())
.map(field -> {
field.setAccessible(true);
return field;
})
.collect(Collectors.toSet());
accessibleFields.forEach(field -> {
try {
fields.put(field.getName(), field.get(o));
} catch (IllegalAccessException e) {
throw new IllegalStateException("Unable to access field", e);
}
});
}
public Set<String> fieldNames() {
return fields.keySet();
}
public Optional<Object> fieldValue(String fieldName) {
return Optional.ofNullable(fields.get(fieldName));
}
}
public static class Source {
private final String fieldA;
private final Integer fieldB;
private final int fieldC;
public Source(String fieldA, Integer fieldB, int fieldC) {
this.fieldA = fieldA;
this.fieldB = fieldB;
this.fieldC = fieldC;
}
public String getFieldA() {
return fieldA;
}
public Integer getFieldB() {
return fieldB;
}
public int getFieldC() {
return fieldC;
}
}
@Test
public void testFields() {
Destination destination = new Destination(new Source("Abc", 123, 456));
destination.fieldNames().stream().forEach(fieldName -> {
System.out.println("Fieldname: " + fieldName + ", value: " + destination.fieldValue(fieldName).get());
});
}
}
有关更多信息,请查看 this SO。
但是,这不是我不会在真正生产代码中使用的东西。相反,我会使用某种序列化,例如使用 Jackson 。
关于java - 在类之间复制和添加字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27753453/