(#Under Construction)
(#Under Construction)
java.lang.Class.forName(String className) (※) -> Java_java_lang_Class_forName0() (= java.lang.Class.forName0()) -> JVM_FindClassFromClassLoader() -> find_class_from_class_loader() -> SystemDictionary::resolve_or_fail() -> (See: here for details) -> Klass::initialize() -> (See: here for details) (※) なお, この関数はクラスローダーとして「現在のクラスを定義するクラスローダ」を使用.
java.lang.Class.forName(String name, boolean initialize, ClassLoader loader) (※) -> Java_java_lang_Class_forName0() (= java.lang.Class.forName0()) -> (同上) (※) なお, この関数はクラスローダーとして「loader 引数で指定されたクラスローダ」を使用.
(以下は, デフォルトのシステムクラスローダ (sun.misc.Launcher$AppClassLoader) の場合)
sun.misc.Launcher$AppClassLoader.loadClass() -> (1) package のチェックを行う. -> java.lang.SecurityManager.checkPackageAccess() (2) スーパークラスの loadClass() に処理を委譲 (URLClassLoader ではオーバーライドしていないため, java.lang.ClassLoader.loadClass() が呼び出される) -> java.lang.ClassLoader.loadClass() (1) 既にロード済みかどうかをチェック (ロード済みならそれを使う) -> java.lang.ClassLoader.findLoadedClass() -> Java_java_lang_ClassLoader_findLoadedClass0() (= java.lang.ClassLoader.findLoadedClass0()) -> JVM_FindLoadedClass() -> SystemDictionary::find_instance_or_array_klass() -> Universe::typeArrayKlassObj() -> Klass::array_klass_or_null() -> SystemDictionary::find() (2) まず, 親に委譲してロードを試みる. 親がいなければ findBootstrapClassOrNull() でロードを試みる. (なお, システムクラスローダーの親は ExtClassLoader である模様) -> java.lang.ClassLoader.loadClass() -> (同上) -> java.lang.ClassLoader.findBootstrapClassOrNull() -> Java_java_lang_ClassLoader_findBootstrapClass() (= java.lang.ClassLoader.findBootstrapClass()) -> JVM_FindClassFromBootLoader() -> SystemDictionary::resolve_or_null() -> (See: here for details) (3) 以上で駄目なら, 自力でのロードを試みる. (java.net.URLClassLoader.findClass() では, コンストラクタで指定された URL の下で指定のクラスファイルを見つけようとする. AppClassLoader が, System.getProperty("java.class.path") で取得したクラスパスを URLClassLoader のコンストラクタに渡しているため, クラスパス下にあるファイルが検出され, defineClass() でロードされる) -> java.net.URLClassLoader.findClass() -> java.net.URLClassLoader.defineClass() -> (1) (クラス名の中にパッケージ部分があれば) パッケージ名のチェックおよびパッケージオブジェクトの登録を行う -> java.net.URLClassLoader.getAndVerifyPackage() -> java.net.URLClassLoader.definePackage() -> java.lang.ClassLoader.definePackage() -> java.lang.ClassLoader.definePackage() (1) クラスをロードする. (2通りのパスがあるがどちらも JVM_DefineClassWithSource() で合流) -> * 指定のクラスファイル(Resource オブジェクト)から ByteBuffer が取得できなかった場合: -> java.lang.ClassLoader.defineClass(byte[] b, int off, int len) -> java.lang.ClassLoader.defineClass(String name, byte[] b, int off, int len) -> java.lang.ClassLoader.defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) -> Java_java_lang_ClassLoader_defineClass1() -> JVM_DefineClassWithSource() -> jvm_define_class_common() -> SystemDictionary::resolve_from_stream() -> (See: here for details) * 〃 ByteBuffer が取得できた場合: -> java.lang.ClassLoader.defineClass(String name, java.nio.ByteBuffer b, ProtectionDomain protectionDomain) -> * direct ByteBufer でない場合: -> java.lang.ClassLoader.defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) -> (同上) * direct ByteBufer である場合: -> Java_java_lang_ClassLoader_defineClass2() -> JVM_DefineClassWithSource() -> (同上) (4) (引数で resolve まで行うよう指定されていれば) resolve 処理を行う. (が, 現状では何もしない) -> java.lang.ClassLoader.resolveClass() -> Java_java_lang_ClassLoader_resolveClass0() (= java.lang.ClassLoader.resolveClass0()) -> JVM_ResolveClass() -> (何もしない)
(#Under Construction)
(See: here for details)
(See: here for details)
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction)
(#Under Construction)
(#Under Construction)
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
(#Under Construction) See: here for details
(#Under Construction)
See: here for details
See: here for details
(#Under Construction) See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.