1

私はこのコードを持っています:

コピーしたいクラス:

public class NormalChair extends AbstractChair {
    protected int height;
    protected String name;
    public NormalChair() {
        super();
    }

    public NormalChair(String name, int height) {
        super(name, height);
    }


    // Copy constructor - getName() and getHeight() are defined in parent class.
    public NormalChair(NormalChair chair) {
      this(chair.getName(), chair.getHeight());
    } 
}

クラスを作成する

public Object createObj(String cls_name, String param1, int param2){ return Class.forName(cls_name).getConstructor(String.class, Integer.class).newInstance(param1, param2); }

次に、これを使用してそのクラスのオブジェクトをコピーしようとします:

Object obj_to_copy = createObj("Classname", "name", 10);
String cls_name = obj_to_copy.getClass().getName();
Class.forName(cls_name).getConstructor(Object.class).newInstance(obj_to_copy);

そして、私はこのエラーを受け取ります:

Exception in thread "main" java.lang.NoSuchMethodException: test.NormalChair.<init>(java.lang.Object)
    at java.lang.Class.getConstructor0(Class.java:2800)
    at java.lang.Class.getConstructor(Class.java:1708)
    at test.ProductTrader.create(ProductTrader.java:57)
    at test.Test.main(Test.java:23)

だから、コピーコンストラクターをオブジェクトとして表示するのとは別の方法で呼び出す必要があると思いますか?

PSまた、この例を単純化して示しました。しかし、実際には、実行前にどのクラスをコピーする必要があるのか​​ わからないため、コピーコンストラクターの使用は、NormalChair class.

アップデート:

質問を更新して、ランタイムの前にオブジェクトをコピーするときに、コピーする必要があるクラスがわからないことをより明確にしました。

4

3 に答える 3

0

コピー コンストラクターが同じクラスのオブジェクトを受け入れると想定できる場合は、次のようなことができます。

class ObjectCopier {
    public static Object copy(Object orig) {
        Class<?> cls = orig.getClass();
        Constructor<?> con = cls.getDeclaredConstructor(cls);

        return ((con == null) ? null : con.newInstance(orig);
    }
}

(未確認ですので、そのように扱ってください)

于 2014-03-31T13:12:58.877 に答える
0

何らかの理由で、Java リフレクションはクラスとメソッドのシグネチャを厳密に一致させます。したがって、一致するコンストラクターを見つけるには、使用可能なコンストラクターを列挙し、一致するコンストラクターを見つける必要がありますClass.getDeclaredConstructors()

タスクを簡素化するために小さなライブラリを作成しました。これは、クラスに一致するメソッドです

興味がある場合は、この libを使用して新しいインスタンスを作成する方法を次に示します。

Object o = OpenBean.newInstance(Class.forName(cls_name));
于 2013-11-10T09:40:12.433 に答える
0

なぜ Java でコピー コンストラクターを使用する必要があるのでしょうか。Java でオブジェクトをコピーする標準的な方法があります。単純に複製します。デフォルトの複製が関係ない場合は、 clone() メソッドをオーバーライドします。

コピーを取得するには、obj.clone() を記述するだけです。

詳細については、clone() の Java ドキュメントを参照してください。

于 2013-11-10T09:47:51.690 に答える