5

リフレクションを使用して抽象先祖クラスで派生クラスのインスタンスを作成することは可能ですか?

abstract class Base {

public Base createInstance(){
  //using reflection
    Class<?> c = this.getClass();
    Constructor<?> ctor = c.getConstructor();
    return ((Base) ctor.newInstance());
}

}//end Base

class Derived extends Base {

 main(){

new Derived().createInstance()

 }

}

4

3 に答える 3

3

あなたはこれを行うことができます

public class Derived extends Base {
    public static void main(String ... args) {
        System.out.println(new Derived().createInstance());
    }
}

abstract class Base {
    public Base createInstance() {
        //using reflection
        try {
            return getClass().asSubclass(Base.class).newInstance();
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

版画

Derived@55fe910c

より一般的なパターンは、Cloneable を使用することです

public class Derived extends Base {
    public static void main(String ... args) throws CloneNotSupportedException {
        System.out.println(new Derived().clone());
    }
}

abstract class Base implements Cloneable {
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

版画

Derived@8071a97

ただし、どちらかを使用する必要は避ける必要があります。通常、ベースが暗黙的に派生に依存しないように、必要なことを行う別の方法があります。

于 2012-11-19T09:39:52.107 に答える
2

それが機能することを証明するのは簡単です:

abstract class Base {
  public Base createInstance() throws Exception {
    return getClass().newInstance();
  }
}

public class Derived extends Base {
  public static void main(String[] args) throws Exception {
    System.out.println(new Derived().createInstance().getClass());
  }
}

プリント

class test.Derived

なぜそれが必要なのか、そしてそれがあなたの問題に対して本当に良いアプローチであるかどうかを二度自問する必要があります。クローン作成が必要な場合は、clone基本的に同じことを行うメカニズムを検討してください。

于 2012-11-19T09:42:23.767 に答える
1

とを使用Class.forName()Class.newInstance()て、任意のクラスを作成できます。しかし、クラスのサブクラスを簡単に識別する方法はありません。これを行う手法については、この JavaWorld のヒントを参照してください。

しかし、本当の問題は、最終的に達成しようとしていることであり、従来の手法を使用してより簡単に実行できるかどうかです。

于 2012-11-19T09:37:06.963 に答える