Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
// 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) {
}
7 回答
使用Object.getClass() . 它返回对象的运行时类型 .
“
Class
”类上还有一个.isInstance方法 . 如果你通过myBanana.getClass()
得到一个对象的类,你可以看到你的对象myApple
是否是与myBanana
相同的类的实例您可以使用:
HTH . 但我认为大多数情况下,将其用于控制流程或类似的事情并不是一个好的做法......
任何建议的方法的任何使用都被认为是基于不良OO设计的代码气味 .
如果你的设计很好,你不应该发现自己需要使用
getClass()
或instanceof
.任何建议的方法都可以,但只需要记住,设计方面 .
在这种情况下我们可以使用反射
例:-
在这种情况下,您将获得对象传递给
HttpServletRequest
interface refference变量的类的名称 .提出了多个正确答案,但还有更多方法:
Class.isAssignableFrom()
并且只是试图转换对象(可能会抛出ClassCastException
) .总结可能的方式
让我们总结一下测试对象
obj
是C
类型实例的可能方法:空处理的差异
虽然
null
处理有区别但是:在前两个方法中,如果
obj
是null
(null
不是任何实例),则表达式求值为false
.第三种方法显然会抛出
NullPointerException
.相反,第4和第5种方法接受
null
,因为null
可以转换为任何类型!注意事项
Class.getName()
不应该用于执行"is-instance-of"测试,因为如果对象不是C
类型但是它的子类,它可能有一个完全不同的名称和包(因此类名显然不匹配)但它仍然是类型C
.对于相同的继承原因
Class.isAssignableFrom()
不对称:如果
obj
的类型是C
的子类,obj.getClass().isAssignableFrom(C.class)
将返回false
.