Java反射-クラスダイナミックロード

1828 ワード

VMはJavaプログラムを実行する際に、使用したすべてのclassを一度にメモリにロードするのではなく、初めてclassを使用する必要がある場合にロードします.例:
// 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を使用する理由です.
小結
  • JVMは、classおよびinterfaceのそれぞれのロードのための対応するClassインスタンスを作成し、classおよびinterfaceのすべての情報を保存する.
  • は、classに対応するClassのインスタンスを取得すると、classのすべての情報を取得することができる.
  • Classインスタンスを介してclassの情報を取得する方法を反射(Reflection)と呼ぶ.
  • JVMは常に動的にclassをロードし、実行期間中に条件に従ってロードclassを制御することができる.