hotspot/src/share/vm/classfile/classLoader.cpp
void ClassLoader::create_class_path_entry(char *path, struct stat st, ClassPathEntry **new_entry, bool lazy) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
JavaThread* thread = JavaThread::current();
{- -------------------------------------------
(1) 条件に応じて, 以下のどれかのオブジェクトを生成し,
new_entry 引数で指定された箇所にセットする.
* lazy 引数が true の場合:
=> LazyClassPathEntry オブジェクト
* (lazy 引数が false でかつ) 指定されたパスがファイルである場合(= ディレクトリではない場合)
=> ClassPathZipEntry オブジェクト
(ただし, この場合は JARファイル(= zip ファイル) でないといけないので,
もし zip として開けなければ ClassNotFoundException を出す)
(また, ... の場合には IOException を出す)
* (lazy 引数が false でかつ) 指定されたパスがディレクトリである場合
=> ClassPathDirEntry オブジェクト
---------------------------------------- -}
if (lazy) {
*new_entry = new LazyClassPathEntry(path, st);
return;
}
if ((st.st_mode & S_IFREG) == S_IFREG) {
// Regular file, should be a zip file
// Canonicalized filename
char canonical_path[JVM_MAXPATHLEN];
if (!get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
// This matches the classic VM
EXCEPTION_MARK;
THROW_MSG(vmSymbols::java_io_IOException(), "Bad pathname");
}
char* error_msg = NULL;
jzfile* zip;
{
// enable call to C land
ThreadToNativeFromVM ttn(thread);
HandleMark hm(thread);
zip = (*ZipOpen)(canonical_path, &error_msg);
}
if (zip != NULL && error_msg == NULL) {
*new_entry = new ClassPathZipEntry(zip, path);
if (TraceClassLoading) {
tty->print_cr("[Opened %s]", path);
}
} else {
ResourceMark rm(thread);
char *msg;
if (error_msg == NULL) {
msg = NEW_RESOURCE_ARRAY(char, strlen(path) + 128); ;
jio_snprintf(msg, strlen(path) + 127, "error in opening JAR file %s", path);
} else {
int len = (int)(strlen(path) + strlen(error_msg) + 128);
msg = NEW_RESOURCE_ARRAY(char, len); ;
jio_snprintf(msg, len - 1, "error in opening JAR file <%s> %s", error_msg, path);
}
EXCEPTION_MARK;
THROW_MSG(vmSymbols::java_lang_ClassNotFoundException(), msg);
}
} else {
// Directory
*new_entry = new ClassPathDirEntry(path);
if (TraceClassLoading) {
tty->print_cr("[Path %s]", path);
}
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.