2012-08-31 3 views
9

Ich habe eine Frage in Bezug auf Java-Klassenfelder.Kopieren von Feldern aus seiner Elternklasse in Java

Ich habe zwei Java-Klassen: Eltern-Kind-

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

Jetzt habe ich eine Instanz der Klasse Parent. Gibt es eine Möglichkeit, eine Instanz der Child-Klasse zu erstellen und alle Felder der übergeordneten Klasse zu kopieren, ohne die Setter nacheinander aufzurufen?

Ich will nicht, dies zu tun:

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

Auch die Parent nicht einen benutzerdefinierten Konstruktor haben und ich kann nicht Konstruktor auf hinzufügen.

Bitte geben Sie Meinungen.

Vielen Dank.

+0

Wie wäre es, die Eltern Getter und Setter in der übergeordneten Kinderklasse. Wie Nambari es vorschlägt. – km1

Antwort

0

Sie können Ihre Felder als protected anstelle von privat festlegen und direkt auf die untergeordnete Klasse zugreifen. Hilft das?

+0

Dies wird nicht helfen, aus der Frage scheint es, dass er eine neue Instanz von Child aus einer anderen Instanz von Parent – mavroprovato

0

Sie können einen Child-Konstruktor erstellen, der ein Parent akzeptiert. Aber dort müssen Sie alle Werte eins nach dem anderen setzen (aber Sie können direkt auf die Child-Attribute zugreifen, ohne festgelegt zu werden).

Es gibt eine Problemumgehung mit Reflektion, aber es fügt nur Komplikation zu diesem hinzu. Sie wollen es nicht nur zum Speichern ein wenig tippen.

1

Haben Sie versucht, diese fällige Reflexion zu tun? Technisch rufen Sie Setter nacheinander auf, aber Sie müssen nicht alle Namen von ihnen kennen.

15

Haben Sie es versucht?

BeanUtils.copyProperties (Kinder, Eltern)

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

+0

erstellen muss Danke für die Antwort .. Eine kleine Kernaktion, Es ist eigentlich BeanUtils.copyProperties (Eltern, Kind) oder (Quelle , Ziel) – sheetal

+0

@Sheetal Eh ... nein. Es ist 'BeanUtils.copyProperties (Ziel, ursprünglich)': https://github.com/apache/commons-beanutils/blob/f9ac36d916bf2271929b52e9b40d5cd8ea370d4b/src/main/java/org/apache/commons/beanutils/BeanUtils.java#L132 – Jasper

+0

@Jasper Ich denke, ich benutze Spring Framework dann https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/BeanUtils.html – sheetal

4

Sie Reflexion ich es tun können und gut für mich arbeiten:

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