java - 在类之间复制和添加字段

标签 java

我想知道以下情况是否可能。

有两个类(源和目标),在代码中我可以这样做:

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/

相关文章:

java - 在 java 中生成 jssecacerts 的问题

java - 在 Eclipse 中创建新 Maven 项目并将其带到 Github 的工作流程

javascript - 类和原型(prototype)。新手如何解读它们

java - 我们应该在观察者模式中使用 Wea​​kReference 吗?

java - 不断取消并重新创建 Timer,Java 中的 TimerTask

java - Jersey : com. sun.jersey.spi.inject.Errors$ErrorMessagesException

java - 即使代码未编译,GroovyClassLoader 对 parseClass 的调用也会成功

java - XPath 输出不连贯

java - 强制 hibernate 在读取之前重新加载 hsqldb 文件

java - 如何使用正则表达式替换电子邮件地址的一部分?