Foo
を拡張する多くのクラスのうちの1つを取る関数を作成しようとしていて、そのクラスの新しいインスタンスをFoo
という新しいインスタンスではなく返します。引数に基づく新しいクラスのインスタンス
これはよくある問題です。そこに良い例はありますか?
クラスを入力パラメーターとして使用したことはありません。クラスのメンバーのみです。私が検索したものに基づいて、これは可能なはずですか?
Foo
を拡張する多くのクラスのうちの1つを取る関数を作成しようとしていて、そのクラスの新しいインスタンスをFoo
という新しいインスタンスではなく返します。引数に基づく新しいクラスのインスタンス
これはよくある問題です。そこに良い例はありますか?
クラスを入力パラメーターとして使用したことはありません。クラスのメンバーのみです。私が検索したものに基づいて、これは可能なはずですか?
Class
オブジェクトをパラメータとして、またはサブクラスのインスタンスFoo
に渡していますか?
解決方法はどちらの場合でもほぼ同じですが、Classオブジェクトに対してnewInstanceメソッドを使用します。
/**
* Return a new subclass of the Foo class.
*/
public Foo fooFactory(Class<? extends Foo> c)
{
Foo instance = null;
try {
instance = c.newInstance();
}
catch (InstantiationException e) {
// ...
}
catch (IllegalAccessException e) {
// ...
}
return instance; // which might be null if exception occurred,
// or you might want to throw your own exception
}
あなたはクラスgetConstructorメソッドを使用して、コンストラクタnewInstance(...)方法、そこからできるコンストラクタ引数が必要な場合。あなたの関数は、この
public class NewInstanceTest {
public static Object getNewInstance(Foo fooObject){
java.lang.Class fooObjectClass = fooObject.getClass();
try {
return fooObjectClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
return null;
} catch (IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
public static void main(java.lang.String[] args){
// This prints Foo
java.lang.System.out.println(getNewInstance(new Foo()).getClass().getName());
// This prints Foo1
java.lang.System.out.println(getNewInstance(new Foo1()).getClass().getName());
}
}
class Foo{
}
class Foo1 extends Foo{
}
ようなことができ
ここでJavaのリフレクションを使用できます。
あなただけのclassnameでClass
を取得したい場合は、Class.forName
を使用します。
Class type = Class.forName('package.SomeClass');
このクラスはFoo
またはそのサブクラスであるかどうかをチェックすることができます:
boolean isFoo = type.isAssignableFrom(Foo.class);
することができます非常に簡単に新しいインスタンスを作成します(コンストラクタが引数を取らないと仮定します)。
Object instance = type.newInstance();
は、この情報がお役に立てば幸いです。
Abstract Factoryパターンをご覧ください。
ありがとうございます。 ...今働いているようだ。他の読書については、この後私は例外の一つを得て、このスレッドで解決しました:http://stackoverflow.com/questions/2120699/newinstance-failed-no-init – SpiRail