Подтвердить что ты не робот

Создать объект класса с конструктором, который принимает строковый параметр?

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

Вот какой код подходит для того, что я хочу:

Object object = null;
Class classDefinition = Class.forName("javax.swing.JLabel");
object = classDefinition.newInstance();

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

4b9b3361

Ответ 1

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

Получите экземпляр Constructor следующим образом:

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

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

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

И все готово.

P.S. Используйте рефлексию как последнее средство!

Ответ 2

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

Class[] type = { String.class };
Class classDefinition = Class.forName("javax.swing.JLabel"); 
Constructor cons = classDefinition .getConstructor(type);
Object[] obj = { "JLabel"};
return cons.newInstance(obj);

Ответ 3

Class.forName("className").newInstance() всегда вызывает конструктор default default.

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

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

Ответ 4

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

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.

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

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

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