Могу ли я использовать Class.newInstance () с аргументами конструктора?

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

Отличный ответ для размышления - это Крис Джестер-Янг.

Damián Rafael Lattenero 01.09.2017 21:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
246
1
147 452
8

Ответы 8

Вы можете получить другие конструкторы с помощью getConstructor (...).

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

Обновлено: в соответствии с комментариями кажется, что для некоторых пользователей недостаточно указания классов и имен методов. Для получения дополнительной информации см. Документацию для получение конструктора и вызывая это.

Ответ не говорит, как вы передаете аргументы, и не показывает пример. Это просто предположение.

djangofan 24.07.2011 04:52

Должен ли он быть getDeclaredConstructor (в единственном числе)?

Luke Skywalker 19.08.2014 19:19

@ryvantage не делает его похожим на статический метод, поскольку все это вызывается в экземпляре myObject. Это просто шлейфовая цепочка вызовов методов. Также не уверен, почему этот ответ был полезен для 55 человек, так как он неправильный, а правильный - ниже!

Arran 28.01.2015 11:59
MyClass.class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");

или же

obj.getClass().getDeclaredConstructor(String.class).newInstance("HERESMYARG");

Просто уточняю - getDeclaredConstructor не является статическим методом, вы должны вызывать его в экземпляре класса для вашего конкретного класса.

clum 22.05.2015 09:31

Похоже, для Java 1.1 ответ отрицательный.

Jim 28.07.2016 14:13

У меня есть общедоступный конструктор с параметрами List <String>. Не могу получить его с помощью getDeclaredConstructor, но с getConstructor работает нормально. Ты знаешь почему?

Line 30.05.2017 12:03

Следует отметить, что это требует от вас перехвата целого ряда исключений. Когда я понял, что их как минимум 4, я просто вставил его в блок try / catch. Кроме того, аргументами getDeclaredConstructor () являются классы параметров конструктора.

Andrew Puglionesi 02.11.2018 02:33

Не используйте Class.newInstance(); см. эту ветку: Почему Class.newInstance () - зло?

Как говорят другие ответы, вместо этого используйте 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);

Выполните следующие шаги, чтобы вызвать параметризованный конструктор.

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

Другие вопросы по теме