Инициализация класса с помощью Class.forName () с конструктором, который принимает аргументы - PullRequest
24 голосов
/ 14 апреля 2011

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

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

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

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

Ответы [ 3 ]

54 голосов
/ 14 апреля 2011

Используйте 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 голосов
/ 11 февраля 2016

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

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

  1. Вы должны получить Конструктор с типами параметров, передав Class[] для getDeclaredConstructor метод класса
  2. Вы должны создать экземпляр конструктора, передав 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

Более подробную информацию смотрите на странице документации оракула *.

1 голос
/ 14 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...