Создать объект класса с конструктором, который принимает строковый параметр?
Я хотел бы создать экземпляр объекта из его объекта Class
, используя конструктор, который принимает один аргумент String
.
Вот какой код подходит для того, что я хочу:
Object object = null;
Class classDefinition = Class.forName("javax.swing.JLabel");
object = classDefinition.newInstance();
Однако он создает объект JLabel
без текста. Я хотел бы использовать конструктор JLabel
, который принимает строку в качестве исходного текста. Есть ли способ выбрать конкретный конструктор из объекта Class
?
Ответы
Ответ 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().