これらは, クラスローディング処理用のクラス. より具体的に言うと, HotSpot のブートストラップ・クラスローダ(bootstrap class loader)を実現するためのクラス (See: here and here for details).
ブートストラップ・クラスローダに関する機能を納めた名前空間(AllStatic クラス).
((cite: hotspot/src/share/vm/classfile/classLoader.hpp))
class ClassLoader: AllStatic {
See: here for details
ClassLoader クラス用の補助クラス.
ロード対象のクラスファイルのパスを表すクラス(の基底クラス). 1つの ClassPathEntry オブジェクトが 1つのディレクトリもしくは 1つの zip ファイルに対応する.
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/classfile/classLoader.hpp))
// Class path entry (directory or zip file)
class ClassPathEntry: public CHeapObj {
See: here for details
ClassPathEntry クラスの具象サブクラスの1つ.
このクラスは, パスが「クラスファイルの入ったディレクトリ」である場合用.
((cite: hotspot/src/share/vm/classfile/classLoader.hpp))
class ClassPathDirEntry: public ClassPathEntry {
ClassLoader::create_class_path_entry() 内で(のみ)生成されている (See: here for details).
See: here for details
ClassPathEntry クラスの具象サブクラスの1つ.
このクラスは, パスが「クラスファイルの入った jar ファイル」である場合用.
((cite: hotspot/src/share/vm/classfile/classLoader.hpp))
class ClassPathZipEntry: public ClassPathEntry {
以下の箇所で(のみ)生成されている.
ClassLoader::create_class_path_entry() (See: here for details)
ClassLoader::create_class_path_zip_entry() (See: here for details)
See: here for details
ClassPathEntry クラスの具象サブクラスの1つ.
このクラスは, 標準ライブラリの jar ファイルを遅延ロードする場合用. LazyBootClassLoader オプションが指定されている場合に使用される (See: LazyBootClassLoader オプション).
((cite: hotspot/src/share/vm/classfile/classLoader.hpp))
// For lazier loading of boot class path entries
class LazyClassPathEntry: public ClassPathEntry {
ClassLoader::create_class_path_entry() 内で(のみ)生成されている (See: here for details).
See: here for details
LazyClassPathEntry クラス用の補助クラス.
起動時に読んだ meta-index ファイルの中身を格納しておくためのクラス (See: LazyBootClassLoader オプション). 不必要な jar ファイルのロードを防止するために使われる.
((cite: hotspot/src/share/vm/classfile/classLoader.hpp))
// Meta-index (optional, to be able to skip opening boot classpath jar files)
class MetaIndex: public CHeapObj {
各 LazyClassPathEntry オブジェクトの _meta_index フィールドに(のみ)格納されている.
ClassLoader::setup_meta_index() 内で(のみ)生成されている.
See: here for details
クラスローディングにかかった処理時間(あるいは関連する処理時間)を記録するためのユーティリティ・クラス.
((cite: hotspot/src/share/vm/classfile/classLoader.hpp))
// PerfClassTraceTime is used to measure time for class loading related events.
// This class tracks cumulative time and exclusive time for specific event types.
// During the execution of one event, other event types (e.g. class loading and
// resolution) as well as recursive calls of the same event type could happen.
// Only one elapsed timer (cumulative) and one thread-local self timer (exclusive)
// (i.e. only one event type) are active at a time even multiple PerfClassTraceTime
// instances have been created as multiple events are happening.
class PerfClassTraceTime {
以下の箇所で(のみ)使用されている.
コンストラクタで計測が開始され, デストラクタで計測が終了する.
See: here for details
See: here for details
See: here for details
See: here for details
ClassLoader クラス内で使用される補助クラス.
ロード済みの java パッケージを覚えておくためのクラス (java.lang.Package クラスの getPackage() メソッドや getPackages() メソッドを実現するためのクラス).
内部はハッシュテーブルとして実装されている.
((cite: hotspot/src/share/vm/classfile/classLoader.cpp))
class PackageHashtable : public BasicHashtable {
ClassLoader クラスの _package_hash_table フィールド (static フィールド) に(のみ)格納されている.
((cite: hotspot/src/share/vm/classfile/classLoader.hpp))
// Hash table used to keep track of loaded packages
static PackageHashtable* _package_hash_table;
((cite: hotspot/src/share/vm/classfile/classLoader.cpp))
instanceKlassHandle ClassLoader::load_classfile(Symbol* h_name, TRAPS) {
...
instanceKlassHandle result = parser.parseClassFile(h_name,
class_loader,
protection_domain,
parsed_name,
false,
CHECK_(h));
// add to package table
if (add_package(name, classpath_index, THREAD)) {
...
(Java_java_lang_Package_getSystemPackages0() からは JVM_GetSystemPackages() が呼び出される. そこから ClassLoader::get_system_packages() が呼び出され, 最終的に ClassLoader::_package_hash_table 内のデータがコピーされてリターンされる.)
((cite: jdk/src/share/native/java/lang/Package.c))
JNIEXPORT jstring JNICALL
Java_java_lang_Package_getSystemPackage0(JNIEnv *env, jclass cls, jstring str)
{
return JVM_GetSystemPackage(env, str);
}
JNIEXPORT jobject JNICALL
Java_java_lang_Package_getSystemPackages0(JNIEnv *env, jclass cls)
{
return JVM_GetSystemPackages(env);
}
((cite: hotspot/src/share/vm/prims/jvm.cpp))
JVM_ENTRY(jobjectArray, JVM_GetSystemPackages(JNIEnv *env))
JVMWrapper("JVM_GetSystemPackages");
JvmtiVMObjectAllocEventCollector oam;
objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(result);
JVM_END
実際のパッケージ情報は PackageInfo オブジェクト内に格納されている (See: PackageInfo).
See: here for details
PackageHashtable クラス内で使用される補助クラス.
PackageHashtable オブジェクト内に格納されるハッシュテーブル・エントリ. 1つの PackageInfo オブジェクトが 1つの java パッケージに対応する.
BasicHashtableEntry のサブクラスになっており, パッケージ名をキーとしてハッシュから取得できるようになっている.
((cite: hotspot/src/share/vm/classfile/classLoader.cpp))
// PackageInfo data exists in order to support the java.lang.Package
// class. A Package object provides information about a java package
// (version, vendor, etc.) which originates in the manifest of the jar
// file supplying the package. For application classes, the ClassLoader
// object takes care of this.
// For system (boot) classes, the Java code in the Package class needs
// to be able to identify which source jar file contained the boot
// class, so that it can extract the manifest from it. This table
// identifies java packages with jar files in the boot classpath.
// Because the boot classpath cannot change, the classpath index is
// sufficient to identify the source jar file or directory. (Since
// directories have no manifests, the directory name is not required,
// but is available.)
// When using sharing -- the pathnames of entries in the boot classpath
// may not be the same at runtime as they were when the archive was
// created (NFS, Samba, etc.). The actual files and directories named
// in the classpath must be the same files, in the same order, even
// though the exact name is not the same.
class PackageInfo: public BasicHashtableEntry {
PackageHashtable::new_entry() 内で(のみ)生成されている.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.