2012-04-12 34 views
54

Nếu tôi có một lớp Hoạt động gọi TestActivity trong ứng dụng của tôi, là có một cách để có được lớp học của mình theo tên của nó như trong ví dụ này:Bắt lớp theo tên của nó

Class<?> c = getClassByName("TestActivity"); 
+0

Vui lòng chọn câu trả lời đúng và đóng bài đăng –

Trả lời

112

sử dụng forName thay vì ..

một cái gì đó như thế này ..

try { 
    Class<?> act = Class.forName("com.bla.TestActivity"); 
} catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
} 
+25

Bạn cũng phải cung cấp tên gói hoàn chỉnh. ví dụ: com.bla.TestActivity làm đối số cho Class.forName – Richie

+1

Bạn cũng có thể làm gì đó để nhận 'Lớp '? – Gobliins

+0

@Gobliins No - trình biên dịch không thể đảm bảo loại lớp bạn sẽ nhận được, vì vậy nó cung cấp cho bạn một Class . Nếu bạn biết loại lớp bạn sẽ nhận được, bạn sẽ phải bỏ nó (thậm chí vẫn còn, bạn nhận được cảnh báo cast không được kiểm soát bởi vì các diễn viên không an toàn). – Dylanthepiguy

4

Các Class.forName dường như có trường hợp ngoại lệ trên đó. Đây chỉ là để mở rộng khi ở trên để giải quyết vấn đề này.

try { t = Class.forName("com.package.classname"); } catch (Exception ignored){} 
+0

Cách thông thường trên SO để trả lời như thế này là ** chỉnh sửa ** câu trả lời của họ. Mặc dù vì các ngoại lệ rất phong phú trong Java (và mã của bạn chỉ bỏ qua nó), một ** nhận xét ** sẽ đủ để giải quyết nó. – crazyhatfish

+5

@crazyhatfish - Có vẻ như Patrick có thể không có đặc quyền để làm bất cứ điều gì hữu ích _except_ đăng câu trả lời của riêng mình. – amess

+1

@amess Rất tiếc, quyền của bạn, tôi quên nhận xét cần có đại diện. Cảm ơn vì đã sửa tôi. – crazyhatfish

0

Bạn có thể sử dụng Class::forName để lấy đối tượng lớp không xác định. Nếu bạn muốn để có được một lớp học đánh máy, bạn có thể sử dụng Class::asSubclass trên lớp trả về bởi Class::forName:

Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity") 
               .asSubclass(Activity.class); 

Tất nhiên bạn cũng sẽ phải xử lý một loạt các loại khác nhau của trường hợp ngoại lệ. Như thường lệ khi đối phó với sự phản chiếu.

1

Đây có thể không phải là câu trả lời phù hợp nhất cho câu hỏi của bạn, nhưng thường khó để mã hóa chữ cái tên lớp cứng thành chuỗi. Có thể tốt hơn nếu sử dụng cú pháp

Class<?> act = TestActivity.class; 

.

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