Скопировать поля из родительского класса в Java

У меня вопрос относительно полей класса Java.

У меня есть два класса Java: родительский и дочерний

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 и скопировать все поля родительского класса, не вызывая сеттеры один за другим?

Я не хочу этого делать:

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

Кроме того, Parent не имеет настраиваемого конструктора, и я не могу добавить на него конструктор.

Пожалуйста, дайте вам мнения.

Большое спасибо.

Ответ 2

вы можете использовать отражение, я делаю это и отлично работаю для меня:

 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
            }
        }
    }
 }

Ответ 3

Вы пытались сделать это должным образом? Технически вы вызываете сеттеры один за другим, но вам не нужно знать их всех.

Ответ 4

Вы можете установить свои поля как protected вместо private и получить доступ к ним непосредственно в дочернем классе. Помогает ли это?

Ответ 5

Вы можете создать конструктор Child, который принимает родительский элемент. Но там вам придется задавать все значения один за другим (но вы можете напрямую обращаться к атрибутам Child, без набора).

Существует обходное решение с отражением, но это только усложняет это.  Вы не хотите его просто для сохранения некоторых типов.