2012-01-13 18 views
27

Mã sau có hợp lệ không?Kiểm tra loại lớp (.class) bằng với một số loại lớp khác

void myMethod (Class classType) { 
    if (classType == MyClass.class) { 
     // do something 
    } 
} 

myMethod (OtherClass.class); 

Nếu không có bất kỳ phương pháp khác, nơi tôi có thể kiểm tra xem một .class qua (Type Class) là loại - MyClass?

Thanx!

+0

Đừng quên chấp nhận câu trả lời hoặc nhận xét nếu câu trả lời không đáp ứng yêu cầu của bạn Fahim. Câu trả lời của Jon là hoàn hảo (như thường lệ). –

Trả lời

43

Có, mã đó hợp lệ - nếu hai lớp đã được tải bởi cùng một trình nạp lớp. Nếu bạn muốn hai lớp được coi là bình đẳng ngay cả khi chúng được tải bởi các trình nạp lớp khác nhau, có thể từ các vị trí khác nhau, dựa trên tên đủ điều kiện, sau đó chỉ cần so sánh tên đủ điều kiện thay thế.

Lưu ý rằng mã của bạn chỉ xem xét chính xác, tuy nhiên - nó sẽ không cung cấp loại "khả năng tương thích gán" (instanceof) khi xem liệu giá trị có liên quan đến một đối tượng hay không một lớp nhất định. Để làm được điều đó, bạn muốn xem Class.isAssignableFrom.

3

Tôi muốn so sánh các tên hợp quy để hoàn toàn chắc chắn, classType.getCanonicalName(). Bằng (MyClass.class.getCanonicalName()).

Lưu ý rằng điều này có thể mang lại các vấn đề với các lớp ẩn danh và bên trong, nếu bạn đang sử dụng chúng, bạn có thể cân nhắc sử dụng getName thay thế.

2

Đó làm việc cho tôi

public class Test 
{ 

void myMethod (Class classType) { 
    System.out.println(classType.isAssignableFrom(Test.class)); 
} 

public static void main(String[] args) { 
    Test t = new Test(); 
    t.myMethod(String.class); 

} 

} 
1

Tôi nghĩ rằng bạn đang tìm kiếm instanceof.

Animal a = new Tiger(); 
System.out.println(a instanceof Tiger); // true 
System.out.println(a instanceof Animal); //true 

Hoặc bạn có thể so sánh hai lớp với

a.getClass() == b.getClass() 
+4

'instanceof' trả về' true' cũng cho các lớp con, có lẽ không phải là những gì OP muốn – user11153

+1

Câu hỏi đặt ra là so sánh các lớp thực tế, không so sánh các đối tượng. –

0

Không sử dụng classType.getCanonicalName().equals(MyClass.class.getCanonicalName()) ở trên sẽ không xem xét bất kỳ Generics (tất cả bản đồ đều giống nhau, tất cả bộ là cùng etc)

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