- 浏览: 127622 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
wind35:
32赞~~~
KDB+ database -
sunnyxiaoxi:
图片看不到
KDB+ database 初步 -
RonQi:
确实很有用的插件
eclipse插件 快速打开文件位置,在命令行打开文件位置 -
zhanshi258:
我们程序员讲究的是严谨,大部分人是讲娱乐
小唠叨 -
li498833284:
因为很多都是屏蔽字
小唠叨
转载自 Ken Wu`s Blog!
让我们一起跟随ClassLoader里的本地方法 findBootstrapClass(), 进入jvm执行启动类加载器加载类的内部实现。
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;
// 摘自 j2sesrcshareclassesjavalangClassLoader.c // 表示该函数将被 java class 以jni方式调用 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; } // 将java的string转成unicode字符, 如果unicode字符长度不超过128 // 则不分配内存,直接拿buf缓存来使用 // 否则就malloc一块内存存放, 如果malloc失败, 则返回NULL clname = getUTF(env, classname, buf, sizeof(buf)); if (clname == NULL) { // 类名为空, 说明 JVM 内存分配失败, 抛出邪恶的OOM. JNU_ThrowOutOfMemoryError(env, NULL); return NULL; } // 将 '.' 转换成 '/' VerifyFixClassname(clname); if (!VerifyClassname(clname, JNI_TRUE)) { // 如果指定的类名不合法, 抛出异常 JNU_ThrowClassNotFoundException(env, clname); goto done; } // 让jvm使用启动类加载器加载类, 第四位标志0表示使用启动类加载器, // throwError为JNI_FALSE时抛出 ClassNotFoundException,而JNI_TRUE抛出NoClassDefFoundError cls = JVM_FindClassFromClassLoader(env, clname, JNI_FALSE, 0, JNI_FALSE); done: if (clname != buf) { // 类名的格式有问题,且没有走buf缓存,则释放掉创建的内存, 防止内存泄漏 free(clname); } return cls; }
// 摘自 hotspotsrcsharevmprimsjvm.h /* * jvm.h头文件, 类似java接口的定义。 × 根据给定的classLoader来加载指定类 × × *env JNI运行环境 × *name 类名(路径) × init 是否需要初始化类的内部数据结构 × loader 类加载器标识 × throwError 抛出的异常类型 */ JNIEXPORT jclass JNICALL JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init, jobject loader, jboolean throwError);
// 摘自 hotspotsrcsharevmprimsjvm.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"); // 确保字符串不为NULL且长度不大于 (1 << 16) -1 , 否则抛出异常 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); } } // 将类名放入一个hashmap, 标记符号用的, 并构造为 symbolHandle // (注意: Handle是一种间接的, 由线程变量分配空间的类,作用是防止GC回收) // CHECK_0是一个宏, 作用是判断是否有没有处理掉的异常, 如果有, 返回0 symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_0); // 将classLoader标识转换成JVM内部表示的数据结构, 并构造为 Handle 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
// 摘自 hotspotsrcsharevmprimsjvm.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 KlassHandle klass_handle(THREAD, klass); if (init && klass_handle->oop_is_instance()) { // 初始化类内部的数据结构 klass_handle->initialize(CHECK_0); } // 分配内存, 生成class对象 return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror()); }
发表评论
-
入手Git
2013-09-18 21:57 1038原本项目一直托管在sourceforge上面. http: ... -
以插件的方式把myeclipse安装到eclipse
2013-04-27 16:56 85871, 请注意eclipse版本问题,笔者用的是eclips ... -
从与大牛richard stallman 聊来的感受
2012-04-25 10:03 940老头非常敬业热心, 写邮件给他, 就算没有时间马上回, 也会有 ... -
Jar Class Finder
2012-04-15 22:38 945Jar Class Finder Jar与Class的查找工 ... -
sourceforge 历程
2012-04-14 19:36 0入门 http://newbiedoc.sourceforg ... -
版本控制之MKS integrity 2007
2011-01-06 16:28 0在新项目中用到了版本控制MKS integrity 2007 -
Open-source License
2010-03-04 11:22 1948Open-source License(转载) ... -
Java 多线程与并发编程专题
2009-11-18 15:55 685http://www.ibm.com/developerwor ... -
浅析Context Class Loader
2009-11-19 11:33 1133转载自 薛笛的专栏http://blog.csdn.net/k ... -
JVM调优总结
2009-11-19 15:35 789转载自http://gq913.iteye.com ... -
Ant build.xml 模板
2009-11-23 14:04 1014<?xml version="1.0" ... -
用javac编译生成不同版本的源码和目标class
2009-11-24 14:47 906转载请自 Ken Wu`s Blog! 合理使用javac的 ... -
java内存模型详解
2009-11-24 14:50 772转载自 Ken Wu`s Blog! 内存模型 (memo ... -
很详细的Log4j配置
2009-11-25 11:01 711来自: http://www.blogjava.net/zJu ... -
Log4j日志文件的使用
2009-11-25 17:32 908转自 http://blog.csdn.net/edg_edu ... -
另一个好的ant文件收藏
2009-11-26 13:30 924<?xml version="1.0" ... -
提示补全组件:Kissy Suggest
2009-11-26 14:06 1015转自 http://www.iteye.com/topic/4 ... -
String in Java
2009-11-26 15:36 782转自 http://hxraid.iteye.com/blog ... -
自定义ClassLoader 简单例子
2009-12-10 16:15 1433转载自 http://www.javaresearch.org ... -
dom4j读写xml文件
2010-01-29 09:34 945首先我们给出一段示例程序: importjava.io.F ...
相关推荐
Java 类加载原理是Java运行时环境中的核心机制之一,它涉及到类的生命周期、类加载器的层次结构以及类的查找和加载过程。了解这一机制对于深入理解Java平台的工作原理至关重要,尤其是在开发自定义类加载器或者处理...
Java 类加载器原理 Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将类的字节码加载到内存中并转换为可执行的Java类。类加载器的作用不仅仅是加载类,还包括确保类的唯一性,避免重复加载,并且遵循特定...
本文主要解析Java类加载的原理,分为三个部分:基础的类加载原理解析、插件环境下的类加载和线程上下文类加载器。 首先,Java虚拟机(JVM)内置了三种预定义的类加载器: 1. 启动(Bootstrap)类加载器:这是最基础的...
Bootstrap类加载器会先看看rt.jar中有没有这个类,因为并没有这个类,所以这个请求由回到Extension类加载器,它会查看jre/lib/ext目录下有没有这个类,如果这个类被Extension类加载器找到,那么它将被加载,而...
Java 类加载器有三种默认使用的类加载器:Bootstrap 类加载器、Extension 类加载器和 System 类加载器(或称作 Application 类加载器)。每种类加载器都有设定好从哪里加载类。 Bootstrap 类加载器负责加载 rt.jar ...
双亲委派模型使得系统类(如java.*开头的类)由Bootstrap ClassLoader加载,而用户自定义类由应用程序类加载器(AppClassLoader)加载。这避免了类的冲突,保持了系统类库的稳定性。但有时我们可能需要打破这种模型...
本文将详细解析Java类加载原理,分为三篇文章进行阐述,分别是:Java类加载原理解析、插件环境下类加载原理解析和线程上下文类加载器。 首先,我们来了解Java虚拟机(JVM)的类加载器结构。JVM预定义了三种主要的类...
WebLogic的主要类加载器包括Bootstrap类加载器、Extension类加载器、Application类加载器以及Domain类加载器等。 2. **Bootstrap类加载器** Bootstrap类加载器是JVM的一部分,负责加载JDK的核心类库,如rt.jar,这...
### 类加载器详解 #### 一、类加载器概述 **类加载器(ClassLoader)**是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译好的`.class`文件加载到JVM中...理解类加载器的工作原理对于深入掌握Java编程有着重要意义。
通过掌握类加载的过程以及类加载器的工作原理,可以帮助开发者更好地处理类加载过程中可能出现的问题,同时也可以为实现某些特殊需求提供支持。希望本文能够帮助读者更加深入地理解和应用Java类加载机制。
### Java 类加载器详解 #### 一、类加载器概述 在Java中,类加载器(Class ...通过理解和掌握类加载器的工作原理及其不同类型的加载器,可以帮助开发者更好地管理Java应用程序的依赖关系,提高程序的性能和可维护性。
Bootstrap类加载器:Bootstrap类加载器是Java虚拟机中的一个基本类加载器,负责加载Java核心类库中的类。 Extension类加载器:Extension类加载器是Java虚拟机中的一个扩展类加载器,负责加载Java扩展类库中的类。 ...
- Java中的类加载器采用双亲委派模型,即一个类首先由启动类加载器Bootstrap ClassLoader尝试加载,如果找不到则交给扩展类加载器Extension ClassLoader,再找不到则交由应用程序类加载器AppClassLoader,最后如果...
1. 启动类加载器(Bootstrap ClassLoader):负责加载 Java 的核心类库,例如 java.lang.String、java.util.ArrayList 等。 2. 扩展类加载器(Extension ClassLoader):负责加载 Java 的扩展类库,例如 javax.xml ...
在Tomcat这样的应用服务器中,类加载器的组织结构和工作原理更是复杂且关键。Tomcat的类加载器设计遵循了Java的双亲委派模型,但又在其基础上进行了一些定制,以满足Web应用程序的特定需求。 首先,Tomcat的类加载...
类加载器遵循双亲委派模型,这意味着当一个类加载器尝试加载类时,它首先会将请求委托给其父类加载器,直到到达顶层的Bootstrap ClassLoader,如果父类加载器无法找到该类,子类加载器才会尝试自己加载。 在Tomcat...
1. **bootstrap class loader**:这是最基础的类加载器,由C++实现,负责加载JRE核心库,如rt.jar,它包含了Java语言的基础类库,如`java.lang.Object`等。 2. **extension class loader**:扩展类加载器,负责加载...