2010-12-08 25 views
15

Javaクラスがある種のオブジェクトを作成する必要がある状況があります。私はパラメータとして作成されたオブジェクトのクラスの名前を与えたいと思います。さらに、作成したクラスにそのコンストラクタのパラメータを渡す必要があります。私は何かを持っていますコンストラクタパラメータを持つクラスから新しいインスタンスを作成する

class Compressor { 

    Class ccos; 

    public Compressor(Class ccos) { 
     this.ccos = ccos; 
    } 

    public int getCompressedSize(byte[] array) { 
     OutputStream os = new ByteArrayOutputStream(); 
     // the following doesn't work because ccos would need os as its constructor's parameter 
     OutputStream cos = (OutputStream) ccos.newInstance(); 
     // .. 
    } 
} 

私はこれをどのように修正することができますアイデアはありますか?

編集:

これは、我々は、複数の異なる入力で複数の異なるコンプレッサーの性能を評価するために必要な研究プロジェクトの一部です。 Class ccosは、Javaの標準ライブラリであるApache Compress Commonsまたはlzma-javaから圧縮されたOutputStreamです。

現在、私は正常に動作するように見える以下のものがあります。他のアイデアを歓迎します。

OutputStream os = new ByteArrayOutputStream(); 
OutputStream compressedOut = (OutputStream) ccos.getConstructor(OutputStream.class).newInstance(os); 
final InputStream sourceIn = new ByteArrayInputStream(array); 
+0

を?ここではどのようなクラスが使用されますか? –

+1

リフレクトでハックするのではなく、抽象的なファクトリを使用することを検討しましたか? –

+0

いくつかの詳細情報を追加編集しました – lhahne

答えて

16

Class.getConstructor(paramsTypes...)メソッドを使用して、コンストラクタでnewInstance(..)を呼び出すことができます。あなたのケースでは次のように使用できる

Compressor.class.getConstructor(Class.class).newInstance(Some.class); 
+1

私はあなたが 'Compressor.class.getConstructor(Class.class).newInstance(someparameter); ' – lhahne

+1

@lhahneを意味すると思います。あなたのパラメータは' Class'型であるため、 'Some.class'にすることができます – Bozho

+0

簡単な例: CreateObjectsはJavaクラスであり、コンストラクタの引数なしで以下の方法でnewInstanceを呼び出すことができます。 'CreateObjects obj2 = CreateObjects.class.getConstructor().newInstance();' – srinivas

1

あなたが(例えばClass.getConstructorsまたはClass.getConstructor経由)関連Constructorオブジェクトを取得し、それにそれが必要とする引数を与えて、constructor.newInstanceを呼び出す必要があります。

-1
class Compresor<T> { 
    private Class<? extends T> clazz; 
    Compresor(final Class<? extends T> cls){ 
     this.clazz = cls 
    } 
} 
+0

私が尋ねたものではない – lhahne

0

例は次のとおりです。 は、connは、データベースへの接続であると言うことができます。

Class[] btarray = { conn.getClass() };  
try{ 
if (classname != null) { 
pmap = (Mapper) Class.forName(
classname).getConstructor(btarray).newInstance(
new Object[] { conn }); 
} 
} catch (Throwable x) { 
    x.printStackTrace(Log.out); 
} 

btarrayを使用すると、引数をコンストラクタに渡すことができます。

3

あなたは春があなたのために処理しているそれらの退屈な例外を扱う避けることができ春ClassUtils及び々BeanUtilsクラスの使用:使用すると、オブジェクトの種類を作成するために `Compressor`を伝えるために必要な理由

Constructor<Car> constructor = ClassUtils.getConstructorIfAvailable(Wheels.class, Etc.class); 
Car car = BeanUtils.instantiateClass(constructor, new Wheels(), new Etc()); 
関連する問題