使用构造函数参数从类创建新实例

2022-09-03 06:17:13

我遇到过这样的情况,我的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();
        // ..
    }
}

你有什么想法,我该如何解决这个问题吗?

编辑:

这是一个研究项目的一部分,我们需要评估具有多个不同输入的多个不同压缩机的性能。 是从Java的标准库Apache Compress Commons或lzma-java压缩的。Class ccosOutputStream

目前我有以下似乎工作正常。欢迎提出其他想法。

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

答案 1

可以使用该方法并调用构造函数。在您的情况下:Class.getConstructor(paramsTypes...)newInstance(..)

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

答案 2

使用Spring ClassUtils和BeanUtils类,您可以避免处理那些繁琐的异常,这些异常是Spring处理:

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