2010-12-08 267 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

爲什麼你需要告訴`創建Compressor`什麼樣的對象?這裏將使用什麼樣的類? – 2010-12-08 11:29:07

+1

您是否考慮過使用抽象工廠而不是反思? – 2010-12-08 13:19:02

+0

編輯添加一些信息 – lhahne 2010-12-08 13:57:58

回答

16

您可以使用Class.getConstructor(paramsTypes...)方法並在構造函數上調用newInstance(..)。你的情況:

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

您有(例如,通過Class.getConstructorsClass.getConstructor)去相關Constructor對象,然後調用constructor.newInstance,給它它需要的參數。

-1
class Compresor<T> { 
    private Class<? extends T> clazz; 
    Compresor(final Class<? extends T> cls){ 
     this.clazz = cls 
    } 
} 
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

使用Spring ClassUtils和BeanUtils的類可以避開處理這些繁瑣的例外是春季爲你辦理:

Constructor<Car> constructor = ClassUtils.getConstructorIfAvailable(Wheels.class, Etc.class); 
Car car = BeanUtils.instantiateClass(constructor, new Wheels(), new Etc());