18

我有一个关于 Java 类字段的问题。

我有两个 Java 类:Parent 和 Child

class Parent{
    private int a;
    private boolean b;
    private long c;

    // Setters and Getters
    .....
}


class Child extends Parent {
    private int d;
    private float e;

    // Setters and Getters
    .....
}

现在我有一个Parent类的实例。有什么方法可以创建Child类的实例并复制父类的所有字段,而无需一一调用setter?

我不想这样做:

   Child child = new Child();
   child.setA(parent.getA());
   child.setB(parent.getB());
   ......

此外,Parent没有自定义构造函数,我无法在其上添加构造函数。

请给你意见。

非常感谢。

4

5 回答 5

26

您是否尝试过使用 apache lib?

BeanUtils.copyProperties(child, parent)

http://commons.apache.org/beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html

于 2012-08-31T15:10:17.693 回答
6

你可以使用反射,我会这样做并且对我来说很好:

 public Child(Parent parent){
    for (Method getMethod : parent.getClass().getMethods()) {
        if (getMethod.getName().startsWith("get")) {
            try {
                Method setMethod = this.getClass().getMethod(getMethod.getName().replace("get", "set"), getMethod.getReturnType());
                setMethod.invoke(this, getMethod.invoke(parent, (Object[]) null));

            } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
                //not found set
            }
        }
    }
 }
于 2015-03-25T14:18:34.300 回答
1

你试过做这个适当的反思吗?从技术上讲,您一一调用设置器,但您不需要知道它们的所有名称。

于 2012-08-31T15:05:24.103 回答
0

您可以将您的字段设置protected为私有字段,并直接在子类上访问它们。这有帮助吗?

于 2012-08-31T15:03:46.117 回答
0

您可以创建一个Child接受 Parent 的构造函数。但是在那里,您必须一一设置所有值(但您可以直接访问子属性,无需设置)。

有一种反射的解决方法,但它只会增加复杂性。你不希望它只是为了节省一些打字。

于 2012-08-31T15:05:07.083 回答