Создание нового экземпляра из класса с параметром конструктора - PullRequest
16 голосов
/ 08 декабря 2010

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

У вас есть идеи, как я могу это исправить?

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

Ответы [ 5 ]

16 голосов
/ 08 декабря 2010

Вы можете использовать метод Class.getConstructor(paramsTypes...) и вызвать newInstance(..) в конструкторе. В вашем случае:

Compressor.class.getConstructor(Class.class).newInstance(Some.class);
3 голосов
/ 15 мая 2013

Используя классы Spring ClassUtils и BeanUtils, вы можете избежать тех утомительных исключений, которые для вас обрабатывает Spring:

Constructor<Car> constructor = ClassUtils.getConstructorIfAvailable(Wheels.class, Etc.class);
Car car = BeanUtils.instantiateClass(constructor, new Wheels(), new Etc());
1 голос
/ 08 декабря 2010

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

0 голосов
/ 06 мая 2013

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

0 голосов
/ 08 декабря 2010
class Compresor<T> {
    private Class<? extends T> clazz;
    Compresor(final Class<? extends T> cls){
        this.clazz = cls
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...