2012-01-13 78 views
27

以下代碼是否有效?檢查班級類型(.class)是否等於其他班級類型

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

myMethod (OtherClass.class); 

如果不是有沒有其他辦法,我可以檢查是否通過。類(類類型)是類型 - MyClass的?

Thanx!

+0

如果答案不符合您的要求Fahim,請不要忘記接受答案或評論。喬恩的答案是無可挑剔的(像往常一樣)。 – 2012-07-15 23:03:31

回答

43

是的,該代碼是有效的 - 如果這兩個類已被加載相同的類加載器。如果您希望這兩個類被視爲相同,即使它們已被不同加載類加載器(可能來自不同位置)基於完全限定名稱,那麼只需比較完全限定名稱即可。

請注意,您的代碼只考慮一個精確比賽,但是 - 它不會提供一種「分配兼容性」的是(比方說)instanceof看到一個值是否是指一個對象,它是實例時不一個給定的班級。爲此,您需要查看Class.isAssignableFrom

3

我寧願比較規範名稱是完全確定的,classType.getCanonicalName()。equals(MyClass.class.getCanonicalName())。

請注意,這可能會導致匿名和內部類的問題,如果您正在使用它們,您可能會考慮使用getName。

2

這對我來說

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

我認爲你正在尋找instanceof工作。

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

另外,您可以比較兩個班,

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

'instanceof'也爲子類返回'true',這可能不是OP想要的 – user11153 2015-03-17 12:36:20

+1

問題是關於比較實際的類,而不是比較對象。 – 2016-05-30 18:10:31

0

不要使用 classType.getCanonicalName().equals(MyClass.class.getCanonicalName()) 上面不會考慮任何泛型(所有地圖都一樣,所有設置都一樣等)