Я хотел бы использовать Class.newInstance(), но экземпляр класса я не имеет конструктора с нулевым значением. Поэтому мне нужно иметь возможность передавать аргументы конструктора. Есть ли способ сделать это?
Можно ли использовать Class.newInstance() с аргументами конструктора?
Ответ 1
MyClass.class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");
или же
obj.getClass().getDeclaredConstructor(String.class).newInstance("HERESMYARG");
Ответ 2
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list);
Изменить: согласно комментариям кажется, что указывать класс и имена методов недостаточно для некоторых пользователей. Для получения дополнительной информации см. Документацию для получение constuctor и вызов.
Ответ 3
Предполагая, что у вас есть следующий конструктор
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);
Ответ 4
Не используйте Class.newInstance(); посмотрите эту тему: Почему Class.newInstance() зло?
Как и другие ответы, используйте Constructor.newInstance() вместо этого.
Ответ 5
Вы можете получить другие конструкторы с getConstructor (...).
Ответ 6
Следуйте инструкциям ниже, чтобы вызвать параметризованный consturctor.
-  Получите Constructorс параметрами, передав типы вClass[]для методаgetDeclaredConstructorClass
-  Создайте экземпляр конструктора, передав значения в 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
Ответ 7
Вы можете использовать метод 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;
    }
}
Ответ 8
Я думаю, что это именно то, что вы хотите http://da2i.univ-lille1.fr/doc/tutorial-java/reflect/object/arg.html
Хотя это кажется мертвой нитью, кто-то может найти это полезным
