How to determine an object's class? How to determine an object's class? java java

How to determine an object's class?


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


Use Object.getClass(). It returns the runtime type of the object.


Multiple right answers were presented, but there are still more methods: Class.isAssignableFrom() and simply attempting to cast the object (which might throw a ClassCastException).

Possible ways summarized

Let's summarize the possible ways to test if an object obj is an instance of type C:

// Method #1if (obj instanceof C)    ;// Method #2if (C.class.isInstance(obj))    ;// Method #3if (C.class.isAssignableFrom(obj.getClass()))    ;// Method #4try {    C c = (C) obj;    // No exception: obj is of type C or IT MIGHT BE NULL!} catch (ClassCastException e) {}// Method #5try {    C c = C.class.cast(obj);    // No exception: obj is of type C or IT MIGHT BE NULL!} catch (ClassCastException e) {}

Differences in null handling

There is a difference in null handling though:

  • In the first 2 methods expressions evaluate to false if obj is null (null is not instance of anything).
  • The 3rd method would throw a NullPointerException obviously.
  • The 4th and 5th methods on the contrary accept null because null can be cast to any type!

To remember: null is not an instance of any type but it can be cast to any type.

Notes

  • Class.getName() should not be used to perform an "is-instance-of" test becase if the object is not of type C but a subclass of it, it may have a completely different name and package (therefore class names will obviously not match) but it is still of type C.
  • For the same inheritance reason Class.isAssignableFrom() is not symmetric:
    obj.getClass().isAssignableFrom(C.class) would return false if the type of obj is a subclass of C.