// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
使用Object.getClass()。 它返回对象的运行时类型。
提出了多个正确答案,但还有更多的方法。
Class.isAssignableFrom()
和简单的尝试投射对象(可能会抛出ClassCastException
)。可能的方法总结如下
让我们总结一下测试对象
obj
是否是类型C
的实例的可能方法。处理 "空 "的差异
但在 "null "的处理上有区别。
obj
是null
(null
不是任何东西的实例),表达式就会评估为false
。NullPointerException
。null
,因为null
可以被转换为任何类型!注释
Class.getName()
不应被用来执行_"is-instance-of"_测试,因为如果对象不是C
类型,而是它的一个子类,它可能有一个完全不同的名称和包(因此类名显然不会匹配),但它仍然是C
类型。Class.isAssignableFrom()
不是_对称的。 如果obj.getClass().isAssignableFrom(C.class)
的类型是C
的子类,则obj.getClass().isAssignableFrom(C.class)
将返回false
。你可以使用。
HTH。但我认为在大多数情况下,对于控制流或类似的东西,使用这个方法是不可取的...
任何建议的方法的使用都被认为是一种代码气味,它是基于一个糟糕的OO设计。
如果你的设计是好的,你不应该发现自己需要使用
getClass()
或instanceof
。任何一个建议的方法都可以,但只是在设计上要记住的东西。
在这种情况下,我们可以使用反射
示例:-
在"
Class
"上也有一个[.isInstance
][1]方法。 类上有一个[.isInstance
][1]方法。 如果你通过myBanana.getClass()
得到一个对象'的类,你可以看到你的对象myApple
是否是和myBanana
同一个类的实例,通过[1]: http://java.sun.com/javase/6/docs/api/java/lang/Class.html#isInstance(java.lang.Object)
如果你想在运行时知道,用
isinstance()
检查是不够的。 使用。