2010-08-26 130 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. 你必须传递类型Class[] 得到Constructor与参数类型的Class
  2. getDeclaredConstructor方法你必须创建构造函数实例通过传递值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 
相关问题