比较Class对象

时间:2010-04-15 16:43:20

标签: java

我必须将Class对象与预定义类列表进行比较。

使用==是否安全或我应该使用equals

if        (klass == KlassA.class) {
} else if (klass == KlassB.class) {
} else if (klass == KlassC.class) {
} else {
}

注意:我无法使用instanceof,我没有对象,我只有Class对象。我(错误)在这种情况下使用它就像一个枚举!

6 个答案:

答案 0 :(得分:27)

java.lang.Class does not覆盖equals的{​​{1}}方法,其实现方式如下:

java.lang.Object

因此public boolean equals(Object obj) { return (this == obj); } a == b相同(除非a.equals(b)为空)。

答案 1 :(得分:3)

对于大多数Java应用程序而言,这是正确的。但是,如果两个类都由同一个类加载器加载,那么使用operator ==比较Java类是安全的。

答案 2 :(得分:2)

我不确定这是否适用于您的具体情况,但您可以尝试Class.isAssignableFrom(Class)

KlassA.class.isAssignableFrom(klass)

答案 3 :(得分:1)

这可能是安全的。

如果对象没有覆盖Equals方法,它将在引用之间进行比较。如果两个变量指向同一个对象,则它们的引用匹配。

答案 4 :(得分:0)

我更喜欢使用==来比较类对象和枚举常量,因为在类型不兼容的情况下会导致编译时错误。

例如:

Class<?> cls1 = Void.class;
String cls2 = "java.lang.String";

if (cls1 == cls2) doSomething();        // Won't compile

if (cls1.equals(cls2)) doSomething();   // Will compile

答案 5 :(得分:0)

如前面的答案所述,要比较Class类型(或java.lang.Class对象)的对象,我们应该使用==运算符。但是,它可能有点令人困惑,因为通过==运算符的对象之间的比较结果总是不能导致正确的结果(我们通常使用equal()方法)。例如,此表达式的结果为false:

new String("book") == new String("book")//false

原因是,

  

虚拟机管理每种类型的唯一Class对象。   因此,您可以使用==运算符来比较java.lang.Class   的物体即可。来自Core Java for the Impatient - Page 153

因此:

new String("book").getClass() == new String("book").getClass()//true

Class.forName("java.lang.String") == Class.forName("java.lang.String")//true

结果为真。