Инициализация класса с Class.forName() и который имеет конструктор, который принимает аргументы

Я создаю экземпляр класса, подобного этому.

myObj = (myObj) Class.forName("fully qualified class name here").newInstance();

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

Спасибо,
Нарендра

Ответ 1

Используйте Class.getConstructor() и вызывайте Constructor.newInstance() на том. Например, если это ваш конструктор в классе Foo:

public Foo(String bar, int baz) {
}

Вам нужно будет сделать что-то вроде этого:

Constructor c = Class.forName("Foo").getConstructor(String.class, Integer.TYPE);
Foo foo = (Foo) c.newInstance("example", 34);

Вам нужно будет знать, какие аргументы нужно передать конструктору. Если это нежелательно, вы должны иметь пустой конструктор. Затем у вас есть методы для установки того, что вы обычно проходите в конструкторе.

Можно спросить, есть ли у вас правильный шаблон здесь. Вам действительно нужно использовать рефлексию, возможно, есть лучший подход? Если вы знаете, что уже собираетесь бросить свой объект, почему бы просто не построить его нормально? Возможно, вы захотите предоставить больше информации о том, почему вам нужно это делать. Есть веские причины, однако вы не указали никаких.

Ответ 2

Если вы выбираете тип объекта для создания в зависимости от string "fully qualified class name here", скорее всего, вы можете его заменить, и вы должны заменить его на Шаблон стратегии.

Ответ 3

newInstance() всегда вызывает конструктор по умолчанию.

если вы хотите вызвать параметризованный конструктор,

  • Вы должны получить конструктор с параметрами, передав Class[] для метода getDeclaredConstructor класса
  • Вам нужно создать экземпляр конструктора, передав Object[] для
     newInstance() метод конструктора

Посмотрите пример кода.

import java.lang.reflect.*;

class NewInstanceDemo{
    public NewInstanceDemo(){
        System.out.println("Default constructor");
    }
    public NewInstanceDemo(int a, long b){
        System.out.println("Two parameter constructor : int,long => "+a+":"+b);
    }
    public NewInstanceDemo( int a, long b, String c){
        System.out.println("Three parameter constructor : int,long,String => "+a+":"+b+":"+c);
    }
    public static void main(String args[]) throws Exception {

        NewInstanceDemo object = (NewInstanceDemo)Class.forName("NewInstanceDemo").newInstance();
        Constructor constructor1 = NewInstanceDemo.class.getDeclaredConstructor( new Class[] {int.class, long.class});
        NewInstanceDemo object1 = (NewInstanceDemo)constructor1.newInstance(new Object[]{1,2});

    }
}

выход:

java NewInstanceDemo
Default constructor
Two parameter constructor : int,long => 1:2

Посмотрите на страницу оракула документация для более подробной информации.