2008-10-24 3 views
197

Я хотел бы использовать Class.newInstance(), но класс, который я создавал, не имеет конструктора с нулевым значением. Поэтому мне нужно иметь возможность передавать аргументы конструктора. Есть ли способ сделать это?Могу ли я использовать Class.newInstance() с аргументами конструктора?

+0

Отличный ответ considere является Chris Jester-Young один. – 2017-09-01 18:02:49

ответ

79
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list); 

Редактировать: в соответствии с комментариями кажется, что указывать имена классов и методов недостаточно для некоторых пользователей. Для получения дополнительной информации ознакомьтесь с документацией для getting constuctor и invoking it.

+17

Ответ не говорит, как вы передаете аргументы или показываете пример. Это просто догадка. – djangofan 2011-07-24 00:52:59

+2

Должно ли быть getDeclaredConstructor (единственное число)? – 2014-08-19 15:19:18

+0

@ryvantage не делает его похожим на статический метод, поскольку его все вызывают в экземпляре «myObject». Это всего лишь цепочка вызовов меток. Также не знаю, почему этот ответ был полезен 55 людям, так как это неправильно, а правильный - ниже! – Arran 2015-01-28 08:59:04

164
Class.getDeclaredConstructor(String.class).newInstance("HERESMYARG"); 
+16

Просто уточнение - `getDeclaredConstructor` не является статическим методом, вы должны вызвать его в экземпляре класса для вашего конкретного класса. – clum 2015-05-22 06:31:27

13

Не использовать Class.newInstance(); см. эту тему: Why is Class.newInstance() evil?

Как и другие ответы говорят, используйте вместо этого Constructor.newInstance().

2

Вы можете использовать метод класса 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; 
    } 
} 
53

Если у вас есть следующее конструктор

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

Следуйте инструкциям ниже, чтобы вызвать параметризованный контурник.

  1. Получить Constructor с типами параметров с помощью проходящих типов в Class[] для getDeclaredConstructor метода Class
  2. Создать экземпляр конструктора, передавая значения в 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