如何确定一个对象的类(用Java)?

如果B类和C类扩展了A类,而且我有一个B或Ctypes的对象,那么我怎样才能确定它实例化了哪一个?

if (obj instanceof C) { //your code } 

使用Object.getClass() 。 它返回对象的运行时types。

提供了多个正确的答案,但还有更多的方法: Class.isAssignableFrom() ,只是试图转换对象(这可能会抛出一个ClassCastException )。

总结可能的方法

我总结了testing对象obj是否为Ctypes实例的可能方法:

 // 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个方法中,如果objnullnull不是任何事物的实例),则expression式评估为false
  • 第三种方法显然会抛出一个NullPointerException
  • 第四种和第五种方法相反接受null因为null可以被转换成任何types!

要记住: null 不是任何types的实例,但可以转换为任何types。

笔记

  • 不应该使用Class.getName()来执行“is-instance-of”testing。如果对象不是Ctypes的,而是它的子类,它可能会有一个完全不同的名称和包不匹配),但它仍然是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的类的名称。