hotspot/src/share/vm/prims/jvm.cpp
JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name))
{- -------------------------------------------
(1) (トレース出力) (See: JVMWrapper)
---------------------------------------- -}
JVMWrapper("JVM_FindLoadedClass");
{- -------------------------------------------
(1) (変数宣言など)
(klass_name 局所変数は, name 引数で指定されたクラス名に対応する TempNewSymbol)
(なお, name 引数の文字列がクラス名としては長すぎる場合 (Symbol::max_length() を超えている場合) は
ここでリターン(返値は NULL))
---------------------------------------- -}
ResourceMark rm(THREAD);
Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
Handle string = java_lang_String::internalize_classname(h_name, CHECK_NULL);
const char* str = java_lang_String::as_utf8_string(string());
// Sanity check, don't expect null
if (str == NULL) return NULL;
const int str_len = (int)strlen(str);
if (str_len > Symbol::max_length()) {
// It's impossible to create this class; the name cannot fit
// into the constant pool.
return NULL;
}
TempNewSymbol klass_name = SymbolTable::new_symbol(str, str_len, CHECK_NULL);
{- -------------------------------------------
(1) (プロファイル情報の記録) ("sun.cls.jvmFindLoadedClassNoLockCalls")
(See: ClassLoader::sync_JVMFindLoadedClassLockFreeCounter())
---------------------------------------- -}
// Security Note:
// The Java level wrapper will perform the necessary security check allowing
// us to pass the NULL as the initiating class loader.
Handle h_loader(THREAD, JNIHandles::resolve(loader));
if (UsePerfData) {
is_lock_held_by_thread(h_loader,
ClassLoader::sync_JVMFindLoadedClassLockFreeCounter(),
THREAD);
}
{- -------------------------------------------
(1) SystemDictionary::find_instance_or_array_klass() を呼んで
既にロード済みかどうかをチェックし, 結果をリターン.
(ロード済みであれば, 対象クラスの mirror オブジェクトを JNI Handle 化してリターン.
ロード済みでなければ NULL をリターン)
---------------------------------------- -}
klassOop k = SystemDictionary::find_instance_or_array_klass(klass_name,
h_loader,
Handle(),
CHECK_NULL);
return (k == NULL) ? NULL :
(jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
JVM_END
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.