2010-08-26 135 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 
相關問題