2010-08-26 2 views
48

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

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

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

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

ответ

75

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"); 

И все готово.

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

8

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

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

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

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

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