2010-12-08 198 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());