2010-08-26 40 views
48

Tôi muốn khởi tạo đối tượng từ đối tượng Class của mình, bằng cách sử dụng hàm tạo chấp nhận một đối số String.Khởi tạo đối tượng lớp bằng hàm tạo chấp nhận tham số chuỗi?

Dưới đây là một số mã rằng cách tiếp cận những gì tôi muốn:

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

Tuy nhiên, nó instantiates đối tượng JLabel không có văn bản. Tôi muốn sử dụng hàm tạo JLabel chấp nhận chuỗi làm văn bản ban đầu. Có cách nào để chọn một nhà xây dựng cụ thể từ một đối tượng Class?

Trả lời

75

Class.newInstance gọi các nhà xây dựng không-arg (một trong đó không có bất kỳ thông số). Để gọi một hàm tạo khác, bạn cần sử dụng gói phản chiếu (java.lang.reflect).

Nhận một trường hợp Constructor như thế này:

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

Các cuộc gọi đến getConstructor quy định cụ thể mà bạn muốn các nhà xây dựng mà phải mất một tham số duy nhất String. Bây giờ để tạo một thể hiện:

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

Và bạn đã hoàn tất.

P.S. Chỉ sử dụng sự phản chiếu như một phương sách cuối cùng!

8

Thông tin sau sẽ phù hợp với bạn. Hãy thử điều này,

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() luôn gọi không có hàm tạo mặc định đối số.

Để gọi constructor parametrized thay vì không tranh luận không-arg constructor,

  1. Bạn có để có được Constructor với các loại tham số theo loại đi qua trong Class[] cho getDeclaredConstructor phương pháp Class
  2. Bạn phải tạo constructor ví dụ bằng cách chuyển các giá trị trong Object[] cho
    newInstance phương thức Constructor

Ví dụ mã:

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

    } 
} 

đầu ra:

java NewInstanceWithReflection 
Default constructor 
Constructor :String => StackOverFlow 
Các vấn đề liên quan