2013-04-11 25 views
12

Tôi muốn chuyển loại lớp như tham số cho một phương thức trong java.all trong đó có cùng tham số hàm tạo và tạo một thể hiện của Lớp đó trong phương thức đó.is điều này có thể?chuyển loại lớp làm tham số và tạo thể hiện của nó

+0

Bạn có chắc chắn thực sự muốn "làm" không? Tôi sẽ không "muốn" để làm điều đó - bao giờ hết. – Dariusz

+0

Trường hợp sử dụng của bạn hấp dẫn điều này là gì? – Santosh

+0

Có các trường hợp sử dụng hợp lệ như các lớp instantiating từ một nhà máy/constructor dựa trên tiêm. Trừ khi bạn đang viết một khuôn khổ như vậy, bạn cũng có thể sử dụng một DI để khởi tạo lớp với việc xây dựng tiêm. –

Trả lời

14

Sử dụng phản ánh để tạo ra các ví dụ:

Object obj = clazz.newInstance(); 

này sẽ sử dụng mặc định no-arg hàm tạo để tạo cá thể.

Constructor<?> constructor = clazz.getConstructor(String.class); 
Object object = constructor.newInstance(new Object[] { strArgument }); 

Để tạo cá thể nếu bạn có một số hàm tạo khác nhận đối số.

3

Bạn cần sử dụng sự phản chiếu để làm điều đó, nhưng vâng, điều đó chắc chắn là có thể.

void MyMethod(Class className) 
{ 
    try { 
     Object obj = className.newInstance(); 
     //obj is a newly created object of the passed in type 
    } 
    catch (Exception ex) { } 
} 
2

Bạn đang tìm kiếm Phản hồi.

phương pháp của bạn sẽ giống như thế này:

public void m1(Class c) { 

     try { 
     Object obj = c.newInstance(); 
     //do something with your new instance 
    } catch (InstantiationException ex) { 

    } catch (IllegalAccessException ex) { 

    } 
} 

Các Oracle doc cho API Reflection là here

1

Có bạn có thể

void x(Class cls) throws InstantiationException, IllegalAccessException { 
    cls.newInstance(); 
} 

Lưu ý rằng Class.newInstance có thể thất bại với

IllegalAccessException - nếu lớp hoặc constructor nullary của nó là không thể truy cập.

InstantiationException - nếu Lớp này đại diện cho lớp trừu tượng, giao diện, lớp mảng, kiểu nguyên thủy hoặc khoảng trống; hoặc nếu lớp không có hàm tạo null; hoặc nếu instantiation không vì một lý do nào khác.

xem API để biết thêm

Các vấn đề liên quan