とある用途でクラス同士の継承関係をチェックする関数を作りましたメモ。
/**
* クラス同士の継承関係をチェックする
* @param c1 ターゲットのクラス
* @param c2 親クラス
* @return c1がc2を継承しているときtrue
*/
boolean check(Class c1, Class c2) {
for (Class x = c1.getSuperclass(); ; x = x.getSuperclass()) {
if (x == c2) return true;
if (x == Object.class) break;
}
return false;
}
Groovyにてチェック関数の挙動を確認してみます。
class A { }
class B extends A { }
class C extends B { }
println check(A.class, B.class)
println check(B.class, A.class)
println check(C.class, A.class)
println check(C.class, Object.class)
false
true
true
true
あとから動的にロードしたクラスだとクラス比較でFalse
となってしまうことがあるようです。その場合はname
同士の比較とするなど ケースバイケースで工夫が必要です。