如何确定一个对象的类(用Java)?
如果B类和C类扩展了A类,而且我有一个B或Ctypes的对象,那么我怎样才能确定它实例化了哪一个?
if (obj instanceof C) { //your code }
使用Object.getClass() 。 它返回对象的运行时types。
提供了多个正确的答案,但还有更多的方法: Class.isAssignableFrom()
,只是试图转换对象(这可能会抛出一个ClassCastException
)。
总结可能的方法
我总结了testing对象obj
是否为C
types实例的可能方法:
// 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
处理的差异
尽pipe在null
处理方面有所不同:
- 在前2个方法中,如果
obj
为null
(null
不是任何事物的实例),则expression式评估为false
。 - 第三种方法显然会抛出一个
NullPointerException
。 - 第四种和第五种方法相反接受
null
因为null
可以被转换成任何types!
要记住:
null
不是任何types的实例,但可以转换为任何types。
笔记
- 不应该使用
Class.getName()
来执行“is-instance-of”testing。如果对象不是C
types的,而是它的子类,它可能会有一个完全不同的名称和包不匹配),但它仍然是C
型。 - 对于相同的inheritance原因,
Class.isAssignableFrom()
不是对称的 :
如果obj
的types是C
的子类,则obj.getClass().isAssignableFrom(C.class)
将返回false
。
您可以使用:
Object instance = new SomeClass(); instance.getClass().getName(); //will return the name (as String) (== "SomeClass") instance.getClass(); //will return the SomeClass' Class object
HTH。 但是我认为大多数情况下使用控制stream或类似的东西并不是一个好习惯。
任何build议的方法的使用被认为是基于糟糕的OOdevise的代码气味。
如果你的devise是好的,你不应该发现自己需要使用getClass()
或instanceof
。
任何build议的方法都可以,但只是要注意devise。
“ Class
”类中还有一个.isInstance
方法。 如果你通过myBanana.getClass()
得到一个对象的类,你可以看到你的对象myApple
是一个与myBanana
类相同的实例
myBanana.getClass().isInstance(myApple)
在这种情况下,我们可以使用reflection
objectName.getClass().getName();
例:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getClass().getName(); }
在这种情况下,您将获得将对象传递给HttpServletRequest
接口参考variables的类的名称。