こんにちは、さるまりんです。
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
// クラスが存在しない
}
動的にクラスのインスタンを取得するコードが良いかどうかは置いておいておきますが、こんな風にチェックできるので、必要に応じて使ってみたいと思います。
読んでくださってありがとうございました。
それではまた!