- galaxystar
- 等级:


- 性别:

- 文章: 531
- 积分: 1603
- 来自: 杭州

|
最后更新时间:2007-10-31 关键字: bootstrap classloader jvm
让我们一起跟随ClassLoader里的本地方法 findBootstrapClass(), 进入jvm执行启动类加载器加载类的内部实现。
java 代码
- private Class findBootstrapClass0(String name)
- throws ClassNotFoundException
- {
- check();
- if (!checkName(name))
- throw new ClassNotFoundException(name);
- return findBootstrapClass(name);
- }
-
- private native Class findBootstrapClass(String name)
- throws ClassNotFoundException;
cpp 代码
-
-
- JNIEXPORT jclass JNICALL
- Java_java_lang_ClassLoader_findBootstrapClass(JNIEnv *env, jobject loader,
- jstring classname)
- {
- char *clname;
- jclass cls = 0;
- char buf[128];
-
- if (classname == NULL) {
-
- JNU_ThrowClassNotFoundException(env, 0);
- return 0;
- }
-
-
-
-
- clname = getUTF(env, classname, buf, sizeof(buf));
- if (clname == NULL) {
-
- JNU_ThrowOutOfMemoryError(env, NULL);
- return NULL;
- }
-
-
- VerifyFixClassname(clname);
-
- if (!VerifyClassname(clname, JNI_TRUE)) {
-
- JNU_ThrowClassNotFoundException(env, clname);
- goto done;
- }
-
-
-
- cls = JVM_FindClassFromClassLoader(env, clname, JNI_FALSE, 0, JNI_FALSE);
-
- done:
- if (clname != buf) {
-
- free(clname);
- }
-
- return cls;
- }
cpp 代码
-
-
-
-
-
-
-
-
-
-
-
- JNIEXPORT jclass JNICALL
- JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init,
- jobject loader, jboolean throwError);
cpp 代码
-
- JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
- jboolean init, jobject loader,jboolean throwError))
- JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name,
- throwError ? "error" : "exception");
-
- if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) {
- if (throwError) {
- THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
- } else {
- THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
- }
- }
-
-
-
- symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_0);
-
- Handle h_loader(THREAD, JNIHandles::resolve(loader));
- jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
- Handle(), throwError, thread);
-
- if (TraceClassResolution && result != NULL) {
- trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
- }
-
- return result;
- JVM_END
cpp 代码
-
- jclass find_class_from_class_loader(JNIEnv* env, symbolHandle name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
-
- klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError, CHECK_0);
-
- KlassHandle klass_handle(THREAD, klass);
- if (init && klass_handle->oop_is_instance()) {
-
- klass_handle->initialize(CHECK_0);
- }
-
- return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
- }
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
| 返回顶楼 |
|
|
- penghao122
- 等级: 初级会员

- 性别:

- 文章: 160
- 积分: 10
- 来自: 广东珠海

|
galaxystar 写道
让我们一起跟随ClassLoader里的本地方法 findBootstrapClass(), 进入jvm执行启动类加载器加载类的内部实现。
java 代码
- private Class findBootstrapClass0(String name)
- throws ClassNotFoundException
- {
- check();
- if (!checkName(name))
- throw new ClassNotFoundException(name);
- return findBootstrapClass(name);
- }
-
- private native Class findBootstrapClass(String name)
- throws ClassNotFoundException;
cpp 代码
-
-
- JNIEXPORT jclass JNICALL
- Java_java_lang_ClassLoader_findBootstrapClass(JNIEnv *env, jobject loader,
- jstring classname)
- {
- char *clname;
- jclass cls = 0;
- char buf[128];
- if (classname == NULL) {
-
- JNU_ThrowClassNotFoundException(env, 0);
- return 0;
- }
-
-
-
- clname = getUTF(env, classname, buf, sizeof(buf));
- if (clname == NULL) {
-
- JNU_ThrowOutOfMemoryError(env, NULL);
- return NULL;
- }
-
- VerifyFixClassname(clname);
- if (!VerifyClassname(clname, JNI_TRUE)) {
-
- JNU_ThrowClassNotFoundException(env, clname);
- goto done;
- }
-
-
- cls = JVM_FindClassFromClassLoader(env, clname, JNI_FALSE, 0, JNI_FALSE);
- done:
- if (clname != buf) {
-
- free(clname);
- }
- return cls;
- }
cpp 代码
-
-
-
-
-
-
-
-
-
-
-
- JNIEXPORT jclass JNICALL
- JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init,
- jobject loader, jboolean throwError);
cpp 代码
-
- JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
- jboolean init, jobject loader,jboolean throwError))
- JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name,
- throwError ? "error" : "exception");
-
- if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) {
- if (throwError) {
- THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
- } else {
- THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
- }
- }
-
-
-
- symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_0);
-
- Handle h_loader(THREAD, JNIHandles::resolve(loader));
- jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
- Handle(), throwError, thread);
- if (TraceClassResolution && result != NULL) {
- trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
- }
- return result;
- JVM_END
cpp 代码
-
- jclass find_class_from_class_loader(JNIEnv* env, symbolHandle name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
-
- klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError, CHECK_0);
-
- KlassHandle klass_handle(THREAD, klass);
- if (init && klass_handle->oop_is_instance()) {
-
- klass_handle->initialize(CHECK_0);
- }
-
- return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
- }
|
| 返回顶楼 |
|
|