Java反射-クラスダイナミックロード
VMはJavaプログラムを実行する際に、使用したすべてのclassを一度にメモリにロードするのではなく、初めてclassを使用する必要がある場合にロードします.例:
これがJVM動的負荷
動的ロード
これは、Log 4 jのjarパッケージをclasspathに入れるだけで、Commons Loggingが自動的にLog 4 jを使用する理由です.
小結 JVMは、 は、 Classインスタンスを介して JVMは常に動的に
// Main.java
public class Main {
public static void main(String[] args) {
if (args.length > 0) {
create(args[0]);
}
}
static void create(String name) {
Person p = new Person(name);
}
}
Main.java
が実行されると、Main
が使用されるため、JVMはまずMain.class
をメモリにロードする.しかし、Person.class
はロードされない.プログラムがcreate()
メソッドを実行しない限り、JVMがPerson
クラスをロードする必要があることを発見した場合、Person.class
は初めてロードされる.create()
メソッドが実行されなければ、Person.class
はロードされません.これがJVM動的負荷
class
の特性である.動的ロード
class
の特性はJavaプログラムにとって非常に重要である.JVMダイナミックロードclass
の機能を利用して、実行期間に条件に応じて異なる実装クラスをロードすることができます.例えば、Commons Loggingは常にLog 4 jを優先し、Log 4 jが存在しない場合にのみJDKのloggingを使用する.JVMのダイナミックロード特性を利用して、大まかな実装コードは以下の通りである.// Commons Logging Log4j:
LogFactory factory = null;
if (isClassPresent("org.apache.logging.log4j.Logger")) {
factory = createLog4j();
} else {
factory = createJdkLog();
}
boolean isClassPresent(String name) {
try {
Class.forName(name);
return true;
} catch (Exception e) {
return false;
}
}
これは、Log 4 jのjarパッケージをclasspathに入れるだけで、Commons Loggingが自動的にLog 4 jを使用する理由です.
小結
class
およびinterface
のそれぞれのロードのための対応するClass
インスタンスを作成し、class
およびinterface
のすべての情報を保存する.class
に対応するClass
のインスタンスを取得すると、class
のすべての情報を取得することができる.class
の情報を取得する方法を反射(Reflection)と呼ぶ.class
をロードし、実行期間中に条件に従ってロードclassを制御することができる.