Создать экземпляр объекта класса с помощью конструктора, который принимает строковый параметр? - PullRequest
72 голосов
/ 26 августа 2010

Я хотел бы создать экземпляр объекта из объекта Class, используя конструктор, который принимает один аргумент String.

Вот код, который подходит к тому, что я хочу:*

Однако создается экземпляр объекта JLabel без текста.Я хотел бы использовать конструктор JLabel, который принимает строку в качестве исходного текста.Есть ли способ выбрать определенный конструктор из Class объекта?

Ответы [ 4 ]

105 голосов
/ 26 августа 2010

Class.newInstance вызывает конструктор без аргументов (тот, который не принимает никаких параметров).Чтобы вызвать другой конструктор, вам нужно использовать пакет отражения (java.lang.reflect).

Получить экземпляр Constructor, подобный следующему:

Class<?> cl = Class.forName("javax.swing.JLabel");
Constructor<?> cons = cl.getConstructor(String.class);

Вызов getConstructor указывает, что вы хотите конструктор, который принимает один String параметр.Теперь создайте экземпляр:

Object o = cons.newInstance("JLabel");

И все готово.

PS Используйте отражение только в качестве крайней меры!

12 голосов
/ 26 августа 2010

Следующее будет работать для вас.Попробуйте это,

Class[] type = { String.class };
Class classDefinition = Class.forName("javax.swing.JLabel"); 
Constructor cons = classDefinition .getConstructor(type);
Object[] obj = { "JLabel"};
return cons.newInstance(obj);
3 голосов
/ 11 февраля 2016

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

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

  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
1 голос
/ 03 июня 2018

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

import java.lang.reflect.*;
import java.util.*;

class RunDemo
{
    public RunDemo(String s)
    {
        System.out.println("Hello, I'm a constructor. Welcome, "+s);
    }  
    static void show()
    {
        System.out.println("Hello.");
    }
}
class Democlass
{
    public static void main(String args[])throws Exception
    {
        Class.forName("RunDemo");
        Constructor c = RunDemo.class.getConstructor(String.class);  
        RunDemo d = (RunDemo)c.newInstance("User");
        d.show();
    }
}

на выходе будет:

Здравствуйте, я конструктор.Добро пожаловать, пользователь

Здравствуйте.

Class.forName ("RunDemo"); загрузит класс RunDemo.

Constructor c = RunDemo.class.getConstructor (String.class); Метод getConstructor () класса Constructor возвращает конструктор, который имеет String в качестве аргумента и его ссылку хранится в объекте 'c' объектаКласс конструктора.

RunDemo d = (RunDemo) c.newInstance ("User"); метод newInstance () класса Constructor создаст экземпляр класса RundDemo и вернет универсальную версию объекта, и он преобразуется в RunDemoТип с помощью Типа литья.

Объект 'd' в RunDemo содержит ссылку, возвращаемую методом newInstance ().

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