Ответ 1
Вы можете использовать метод Class.getConstructor(paramsTypes...)
и вызвать newInstance(..)
в конструкторе. В вашем случае:
Compressor.class.getConstructor(Class.class).newInstance(Some.class);
У меня есть ситуация, когда мой класс 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);
Вы можете использовать метод Class.getConstructor(paramsTypes...)
и вызвать newInstance(..)
в конструкторе. В вашем случае:
Compressor.class.getConstructor(Class.class).newInstance(Some.class);
Используя классы Spring ClassUtils и BeanUtils, вы можете избежать проблем с утомительными исключениями, которые Spring обрабатывают для вас:
Constructor<Car> constructor = ClassUtils.getConstructorIfAvailable(Wheels.class, Etc.class);
Car car = BeanUtils.instantiateClass(constructor, new Wheels(), new Etc());
Вам нужно перейти к соответствующему объекту Constructor
(например, через Class.getConstructors
или Class.getConstructor
), а затем вызвать constructor.newInstance
, указав необходимые ему аргументы.
Пример, который вы можете использовать, выглядит следующим образом: 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 позволяет передавать аргументы конструктору.
class Compresor<T> {
private Class<? extends T> clazz;
Compresor(final Class<? extends T> cls){
this.clazz = cls
}
}