Создание нового экземпляра из класса с параметром конструктора

У меня есть ситуация, когда мой класс 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 parameter
        OutputStream cos = (OutputStream) ccos.newInstance();
        // ..
    }
}

Есть ли у вас идеи, как я мог бы это исправить?

Edit:

Это часть исследовательского проекта, где нам необходимо оценить производительность нескольких разных компрессоров с несколькими различными входами. Class ccos является сжатым OutputStream из стандартной библиотеки Java, Apache Compress Commons или lzma-java.

В настоящее время у меня есть следующее, которое работает нормально. Другие идеи приветствуются.

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());

Ответ 3

Вам нужно перейти к соответствующему объекту Constructor (например, через Class.getConstructors или Class.getConstructor), а затем вызвать constructor.newInstance, указав необходимые ему аргументы.

Ответ 4

Пример, который вы можете использовать, выглядит следующим образом: let say 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 позволяет передавать аргументы конструктору.

Ответ 5

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