如何获取对象所属的类?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:如何获取对象所属的类?

如果类B和类C都继承了类A。现在我有一个类型为BC的对象,我如何确定这个实例是什么类的对象。

回答一

  1. 直接判断类型
if (obj instanceof C) {
//your code
}
复制代码
  1. 获取对象所属类
 Object.getClass()
复制代码

回答二

广大的大佬们给出了很多办法,但是仍然有更多的办法:

  • Class.isAssignableFrom()
  • 简单的尝试强制转换对象,可能会引发ClassCastException错误

我总结了所有可用的方法

让我们测试一下判断Object obj是否是C类型实例的可能方法:

// 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) {
}
复制代码

对于null的不同处理方式

在前两个方法中,如果objnull,表达式的计算结果为falsenull不是任何对象的实例,但可以强转成任何类型)。

第三个方法显然会抛出NullPointerException

相反,第4和第5个方法接收null,因为null可以转换为任何类型!

注意null不是任何类型的实例,但它可以转换为任何类型。

不应该使用Class.getName()执行is instance of测试,因为对象如果不是C类型而是它的子类,则它可能具有完全不同的名称和包名,但它仍然是C类型。

回答三

大佬们提出了很多方法,但是我认为导致这个问题出现的原因是由于OOP的恶臭设计。

如果你的代码设计很好,你应该是不需要使用getClass()或者instanceof

任何一种建议的方法都可以,但是要记住,设计也很重要。

文章翻译自Stack Overflow:stackoverflow.com/questions/5…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享