2012-08-31 54 views
9

Javaクラスフィールドに関する質問があります。Javaの親クラスのフィールドをコピーする

私は2つの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クラスのインスタンスを作成し、セッターを1つずつ呼び出さずに親クラスのすべてのフィールドをコピーする方法はありますか?

私はこれを行うにはしたくない:

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

また、Parentは、カスタムコンストラクタを持っていないと私はそれにコンストラクタを追加することはできません。

意見をお寄せください。

多くのありがとうございます。

+0

どのように両親のゲッターとセッターをオーバーライドについて子クラス。ナンバリが示唆するように。 – km1

答えて

0

フィールドをプライベートではなくprotectedとして設定し、子クラスに直接アクセスすることができます。それは役に立ちますか?

+0

これは助けにならないでしょう、彼は親の別のインスタンスからChildの新しいインスタンスを作成する必要があるようです – mavroprovato

0

親を受け入れるChildコンストラクタを作成できます。しかし、そこでは、すべての値を1つずつ設定する必要があります(しかし、子属性には、セットなしで直接アクセスできます)。

リフレクションの回避策がありますが、これには複雑さが増します。 いくつかの入力を保存するためには必要ありません。

1

これは反射によるものですか?テクニシャンあなたはセッターを一つずつ呼びますが、それらのすべての名前を知る必要はありません。

15

試しましたか?

BeanUtils.copyProperties(子、親)

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

+0

答えてくれてありがとう..ちょっとしたこと、実際はBeanUtils.copyProperties(parent、child)または(source 、ターゲット) – sheetal

+0

@sheetal Eh ... no。これは 'BeanUtils.copyProperties(destination、original)'です:https://github.com/apache/commons-beanutils/blob/f9ac36d916bf2271929b52e9b40d5cd8ea370d4b/src/main/java/org/apache/commons/beanutils/BeanUtils.java#L132 – Jasper

+0

@ジャスパー私は春のフレームワークを使用していると思うhttps://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/BeanUtils.html – sheetal

4

あなたはリフレクションを使用することができます私はそれを行うと私のために正常に動作:

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 
      } 
     } 
    } 
} 
関連する問題