(#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.