2012年2月8日水曜日

Java Class.isAssignableFromメソッド

Javaクラスの継承関係を調べるClass.isAssignableFromメソッドの使い方をいつも忘れるのでメモ

ClassA,ClassBがあって、ClassBがClassAを継承している(ClassB extends ClassA)のときは以下のようになる。

class ClassB extends ClassA { ... }

ClassA.class.isAssignableFrom(ClassB.class) = true
ClassB.class.isAssignableFrom(ClassA.class) = false


instanceofとよく似ているが、instanceofはあるインスタンスがあるクラスを継承したものかを調べるのに対して、isAssignableFromメソッドはクラス同士で継承関係を調べるときに使う。

以下コードの(2)のように書くとinstanceofと同等の使い方となる。
まあinstanceofの場合はbがnullだった場合もnullチェックせずに使えるので便利だろう。

ClassB b = new ClassB();

// (1) これはtrueになる
if (b instanceof ClassA) { ... }

// (2) これもtrueになる
if (ClassA.class.isAssignableFrom(b.getClass())) { ... }


普通のプログラムだとisAssignableFromメソッドはあまり使わないが、クラスのメタ情報を使って動くようなプログラムを書くときは個人的にはよく使います。