Я бы сказал, что это не похоже на типичный вариант использования для отражения.В любом случае, чтобы попытаться ответить на ваши вопросы:
То, что вы можете сделать, - это включить конструктор по умолчанию независимо от того, является ли он личным или нет, с помощью ctor.setAccessible(true)
, и создать его с помощью, например,clazz.newInstance()
.Если он, однако, не существует, вы в игре на угадывание параметров конструктора или в sun.misc.Unsafe.allocateInstance(clazz)
, ни один из которых не является предпочтительным.
Для чего вы его используете, похоже, его должно хватить со ссылкой на класс.Передача объекта подразумевает, что он используется, но это не совсем так.
Если вам нужно передать объект только для того, чтобы получить аргументы его конструктора, то я бы сказал, что вам лучше передать фабрику для этого объекта, чтобы избежать полного отражения,Это также рекомендация Oracle Руководство по безопасному кодированию .
Модификация для передачи фабрики могла бы позволить каждому классу, который вы хотите создать, предоставить собственную фабричную логику, например,
interface FactoryProvider<T> {
public T getInstance();
}
class Concrete implements FactoryProvider<Concrete> {
@Override
public Concrete getInstance() {
return new Concrete();
}
}
Но опять же,если у вас есть полный контроль над исходным кодом всех объектов, созданных таким образом, вы можете сами убедиться, что все они имеют конструктор по умолчанию.