Я хотел бы использовать Class.newInstance()
, но класс, который я создавал, не имеет конструктора с нулевым значением. Поэтому мне нужно иметь возможность передавать аргументы конструктора. Есть ли способ сделать это?Могу ли я использовать Class.newInstance() с аргументами конструктора?
ответ
Вы можете получить другие конструкторы с getConstructor(...).
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list);
Редактировать: в соответствии с комментариями кажется, что указывать имена классов и методов недостаточно для некоторых пользователей. Для получения дополнительной информации ознакомьтесь с документацией для getting constuctor и invoking it.
Ответ не говорит, как вы передаете аргументы или показываете пример. Это просто догадка. – djangofan 2011-07-24 00:52:59
Должно ли быть getDeclaredConstructor (единственное число)? – 2014-08-19 15:19:18
@ryvantage не делает его похожим на статический метод, поскольку его все вызывают в экземпляре «myObject». Это всего лишь цепочка вызовов меток. Также не знаю, почему этот ответ был полезен 55 людям, так как это неправильно, а правильный - ниже! – Arran 2015-01-28 08:59:04
Class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");
Просто уточнение - `getDeclaredConstructor` не является статическим методом, вы должны вызвать его в экземпляре класса для вашего конкретного класса. – clum 2015-05-22 06:31:27
Не использовать Class.newInstance()
; см. эту тему: Why is Class.newInstance() evil?
Как и другие ответы говорят, используйте вместо этого Constructor.newInstance()
.
Вы можете использовать метод класса getDeclaredConstructor
. Он ожидает массив классов. Вот проверенный и рабочий пример:
public static JFrame createJFrame(Class c, String name, Component parentComponent)
{
try
{
JFrame frame = (JFrame)c.getDeclaredConstructor(new Class[] {String.class}).newInstance("name");
if (parentComponent != null)
{
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
else
{
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
frame.setLocationRelativeTo(parentComponent);
frame.pack();
frame.setVisible(true);
}
catch (InstantiationException instantiationException)
{
ExceptionHandler.handleException(instantiationException, parentComponent, Language.messages.get(Language.InstantiationExceptionKey), c.getName());
}
catch(NoSuchMethodException noSuchMethodException)
{
//ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.NoSuchMethodExceptionKey, "NamedConstructor");
ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.messages.get(Language.NoSuchMethodExceptionKey), "(Constructor or a JFrame method)");
}
catch (IllegalAccessException illegalAccessException)
{
ExceptionHandler.handleException(illegalAccessException, parentComponent, Language.messages.get(Language.IllegalAccessExceptionKey));
}
catch (InvocationTargetException invocationTargetException)
{
ExceptionHandler.handleException(invocationTargetException, parentComponent, Language.messages.get(Language.InvocationTargetExceptionKey));
}
finally
{
return null;
}
}
Я думаю, что это именно то, что вы хотите http://da2i.univ-lille1.fr/doc/tutorial-java/reflect/object/arg.html
Хотя это кажется мертвой нить, кто-то может оказаться полезным
Если у вас есть следующее конструктор
class MyClass {
public MyClass(Long l, String s, int i) {
}
}
Вам нужно будет показать вы намерены использовать этот конструктор так:
Class classToLoad = MyClass.class;
Class[] cArg = new Class[3]; //Our constructor has 3 arguments
cArg[0] = Long.class; //First argument is of *object* type Long
cArg[1] = String.class; //Second argument is of *object* type String
cArg[2] = int.class; //Third argument is of *primitive* type int
Long l = new Long(88);
String s = "text";
int i = 5;
classToLoad.getDeclaredConstructor(cArg).newInstance(l, s, i);
Следуйте инструкциям ниже, чтобы вызвать параметризованный контурник.
- Получить
Constructor
с типами параметров с помощью проходящих типов вClass[]
дляgetDeclaredConstructor
методаClass
- Создать экземпляр конструктора, передавая значения в
Object[]
для
newInstance
методConstructor
Пример кода:
import java.lang.reflect.*;
class NewInstanceWithReflection{
public NewInstanceWithReflection(){
System.out.println("Default constructor");
}
public NewInstanceWithReflection(String a){
System.out.println("Constructor :String => "+a);
}
public static void main(String args[]) throws Exception {
NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance();
Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor(new Class[] {String.class});
NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"});
}
}
выход:
java NewInstanceWithReflection
Default constructor
Constructor :String => StackOverFlow
Отличный ответ considere является Chris Jester-Young один. – 2017-09-01 18:02:49