2011-01-14 32 views
5

Tôi đã tự hỏi liệu có thể khai báo một đối tượng mới của một số kiểu Java nhất định hay không, vì tôi có kiểu đó được biểu diễn như một đối tượng Lớp.Khai báo đối tượng Java với tên kiểu/lớp của nó như là chuỗi

Ví dụ, chúng ta hãy nói rằng tôi có

SomeClass obj1; 
Class c = obj1.getClass(); 

Bây giờ tôi muốn nhân "c" và sử dụng nó để khai báo một đối tượng mới của loại đó. Nội dung nào đó dọc theo các dòng sau:

Class<c> my_new_var; 

sao cho my_new_var sau đó sẽ là biến cùng loại/lớp như obj1. Điều này liên quan trực tiếp, tôi đoán, cho dù chúng ta có thể sử dụng một đối tượng Class (hoặc một cái gì đó liên quan đến đối tượng Class đó) như một kiểu trong khai báo một biến mới.

Điều đó có thể xảy ra hoặc không thể kể từ khi Java được nhập mạnh?

Cảm ơn trước,

Bruno

+0

thủ đoạn gian trá động như vậy thậm chí còn khuyến khích bằng các ngôn ngữ năng động. Tại sao bạn nghĩ rằng đây là một ý tưởng tốt? – delnan

Trả lời

2
YourType newObject = c.newInstance(); 

Nhưng bạn cần phải có một constructor không có arg. Nếu không, bạn sẽ phải phản ánh nhiều hơn.

Lưu ý rằng không cần phải bỏ nếu tham số Class của bạn được tham số hóa. Nếu không, như trong mã của bạn, bạn cần một dàn diễn viên.

Đối với câu hỏi thứ 2 của bạn - không, không thể khai báo biến kiểu động, vì có, java được nhập tĩnh. Bạn phải xác định loại biến tại thời gian biên dịch. Trong ví dụ trên, bạn có thể:

  • sử dụng Object, nếu bạn không biết loại, bởi vì nó là siêu lớp của tất cả các đối tượng.
  • sử dụng Generics. Ví dụ (với xử lý ngoại lệ bỏ qua):

    public static <T> T createNewInstance(T exampleInstance) { 
        return (T) exampleInstance.getClass().newInstance(); 
    } 
    
+2

Miễn là lớp học của bạn có hàm khởi tạo không tham số công khai. – biziclop

+0

Cảm ơn Bozho. Tôi hiểu rằng c.newInstance() sẽ cho tôi một đối tượng mới cùng kiểu như obj1; vấn đề là khi khai báo newObject, tôi vẫn cần phải khai báo nó là "YourType", mà tôi cho rằng tôi không biết ngoại trừ thông qua "c". Lý tưởng nhất là tôi thấy rằng một cái gì đó như Class có thể được sử dụng như một kiểu khi khai báo một biến mới - như vậy tôi có thể làm Class newObject = c.newInstance(), nhưng tôi hiểu rằng điều này có thể là không thể. đã nhập. Tôi có đúng không? Một lần nữa xin cảm ơn! – Bruno

+0

Như trong ví dụ thứ 2 của tôi với 'T' (hoặc' Object'), bạn có thể trì hoãn việc khai báo loại thực tế. Nhưng tại một số điểm bạn sẽ cần phải biết chính xác loại. Nếu bạn không cần nó (để gọi các phương thức trên nó), thì bạn có thể chỉ đơn giản gọi nó là 'Object' – Bozho

0

Như thế này:

Class c = Class.forName("com.xyzws.SomeClass"); 
Object a = c.newInstance(); 
1

Nếu bạn có một constructor mặc định:

SomeClass obj2 = (SomeClass) c.newInstance(); 
+0

Cảm ơn Adbullah. Tôi hiểu giải pháp của bạn, nhưng lưu ý rằng SomeClass, trong lệnh của bạn, chính xác là kiểu/lớp được đại diện bởi c, mà trong trường hợp này tôi giả sử tôi không biết (ngoại trừ thông qua c). Lý tưởng nhất là những gì tôi muốn tìm là một cái gì đó như Class có thể được sử dụng như một loại khi khai báo một biến mới - như vậy mà tôi có thể làm một cái gì đó như Class newObject = c.newInstance(), nhưng tôi hiểu rằng điều này có thể là không thể vì Java được gõ tĩnh. Tôi có đúng không? Một lần nữa xin cảm ơn! – Bruno

+0

Trong bất kỳ ngôn ngữ hướng đối tượng nào, bạn phải biết loại thứ gì đó trước khi bạn có thể làm bất cứ điều gì với nó. Trong Java, đây có thể là một giao diện hoặc một lớp cơ sở và bạn có thể truyền sang một trong hai lớp. Không biết gì khác, nó chỉ là một chiếc Object và có rất ít thứ bạn có thể làm với nó. –

0

my_new_var sẽ loại Class<SomeClass>, đó là không giống như obj1 đó là loại SomeClass.

Tuy nhiên my_new_var.newInstance() cung cấp cho bạn đối tượng mới cùng loại với obj1.

0

Vâng, bạn có thể làm điều này:

SomeClass obj1 = ... 
Class<? extends SomeClass> c = obj1.getClass(); 
SomeClass obj2 = c.newInstance(); 

Điều này đòi hỏi một constructor không có arg trên bất kỳ lớp con (nếu có) của SomeClassobj1 thực sự là.

Tuy nhiên, điều này chỉ hoạt động vì bạn biết loại đối tượng Class được đề cập. Với một số đối tượng Class hoặc Class<?> thô tùy ý, bạn sẽ không biết loại đối tượng newInstance() sẽ trả về và bạn chỉ có thể khai báo cá thể đó là Object.

0

đối với tôi đây làm việc:

Object innerObj = classObj.getClass().newInstance(); 
Các vấn đề liên quan