2012-01-28 6 views
0

Fooを拡張する多くのクラスのうちの1つを取る関数を作成しようとしていて、そのクラスの新しいインスタンスをFooという新しいインスタンスではなく返します。引数に基づく新しいクラスのインスタンス

これはよくある問題です。そこに良い例はありますか?

クラスを入力パラメーターとして使用したことはありません。クラスのメンバーのみです。私が検索したものに基づいて、これは可能なはずですか?

答えて

1

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

ようなことができ

+0

ありがとうございます。 ...今働いているようだ。他の読書については、この後私は例外の一つを得て、このスレッドで解決しました:http://stackoverflow.com/questions/2120699/newinstance-failed-no-init – SpiRail

0

ここでJavaのリフレクションを使用できます。

あなただけのclassnameでClassを取得したい場合は、Class.forNameを使用します。

Class type = Class.forName('package.SomeClass'); 

このクラスはFooまたはそのサブクラスであるかどうかをチェックすることができます:

boolean isFoo = type.isAssignableFrom(Foo.class); 

することができます非常に簡単に新しいインスタンスを作成します(コンストラクタが引数を取らないと仮定します)。

Object instance = type.newInstance(); 
1

は、この情報がお役に立てば幸いです。