こんにちは、さるまりんです。
Javaのプログラムからあるクラスが存在するかをチェックする方法を考えてみました。
Class.forName()でチェック
ClassクラスのforName()メソッドを使って次のコードのように判断できます。
String className = "com.salumarine.mvnexp.obj.SomeObject";
try {
Class.forName(className);
// クラスが存在する
} catch (ClassNotFoundException e) {
// ClassNotFoundException
// クラスが存在しない
}
クラスパス上にクラスがあれば、そのClassクラスのオブジェクトを返し、ない場合はClassNotFoundExceptionが発生します。
ClassLoaderを使用する
ClassLoaderを使用して、クラスをロードすることができるかを調べます。
String className = "com.salumarine.mvnexp.obj.SomeObject";
try {
ClassLoader.getSystemClassLoader().loadClass(className);
// クラスが存在する
} catch (ClassNotFoundException e) {
// ClassNotFoundException
// クラスが存在しない
}
Class.forName()再び
上の二つの方法でクラスがあるかをチェックできました。
違いは一つ目のClass.forName()を使う方法はクラスを初期化し、二つ目のClassLoaderを使用する方法はクラスを初期化しません。
com.salumarine.mvnexp.obj.SomeObjectのクラスがこんなふうに実装されているとします。
package com.salumarine.mvnexp.obj;
public class SomeObject {
static {
System.out.println("static init block executed");
}
}
一つ目の方法では標準出力に
static init block executed
と表示され、staticな初期化ブロックが実行されるのがわかります。
この初期化をClass.forName()で行わないようにするには下のように二つ目の引数にfalseを渡して初期化しないように、三つ目の引数にはClassLoaderを渡します。
String className = "com.salumarine.mvnexp.obj.SomeObject";
try {
Class.forName(className, false, ClassLoader.getSystemClassLoader());
// クラスが存在する
} catch (ClassNotFoundException e) {
// ClassNotFoundException
// クラスが存在しない
}
動的にクラスのインスタンを取得するコードが良いかどうかは置いておいておきますが、こんな風にチェックできるので、必要に応じて使ってみたいと思います。
読んでくださってありがとうございました。
それではまた!