如何确定一个对象的类(用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个方法中,如果obj为null(null不是任何事物的实例),则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的类的名称。