`

bootstrap类加载原理

    博客分类:
  • jvm
阅读更多
让我们一起跟随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());
}
分享到:
评论

相关推荐

    Bootstrap官网教程整理

    Bootstrap 网格系统(Grid System)的工作原理 21 媒体查询 21 网格选项 22 响应式的列重置 23 偏移列 25 嵌套列 26 列排序 28 Bootstrap 排版 31 标题 31 引导主体副本 33 强调 34 缩写 35 地址(Address) 36 引用...

    bootstrap table表格使用方法详解

    2.加载成功,根据$table.bootstrapTable({options})显示表格样式。 感觉还是挺漂亮的哈,OK,下面贴代码解释功能。  开始之前,当然要引用js啦 &lt;link href="~/Content/bootstrap.min.css" rel="stylesheet" /&...

    无侵入的Bootstrap定制版EvaBootstrap.zip

    技术上来讲,EvaBootstrap的实现原理就是在TB有侵入性的代码上加入了一些CSS Class命名空间,所以使用时会与TB有细微的差别: 文本排版 对于需要文本排版的元素,需要增加一个class .typo: 在Twitter Bootstrap中...

    面试问题-java-spring-sql

    类加载器和Bootstrap类加载器的类型? 使用瞬态关键字 HashMap是在哪个数据结构上? Java 8消除了permGen内存块,为什么? 与stream()可选是否可以应用? 春天 @Bean可以在类级别使用吗? Spring自动接线的...

    Bootstrap-bsSuggest实现二级联动!!!无需修改源码!!全网首创?

    博主在工作中再次碰见问题,发现很多网上解决bsSuggest组件实现二级联动都是修改源码才能解决问题,但因为Bootstrap的更新,源码也更新很快,网上都已经是老的解决办法,今天博主就给大家写一篇很蠢但是很实用的解决...

    kohana-2-admin:基于 Kohana 2.3.1 和 Bootstrap 3 CSS 框架的管理系统

    这是它的工作原理: 所有 /admin/* URL 将首先尝试加载名为“be_%SECTION_NAME%”的控制器文件,如果找不到该名称的控制器,则它将回退到正常路由。 所有其他 URL 将首先尝试加载名为“fe_%SECTION_NAME%”的控制器...

    Bootstrap进度条组件知识详解

    在网页中,经常见到进度条效果,如:平分系统、加载状态等,进度条组件使用了css3的transition和animation属性来完成一些特效,这些特效在IE9及IE9以下版本、Firefox的老版本中并不支持,Opera 12 不支持 animation ...

    Node.js 开发指南.pdf

    5.5.4 使用Bootstrap 104 5.6 用户注册和登录 107 5.6.1 访问数据库 107 5.6.2 会话支持 110 5.6.3 注册和登入 111 5.6.4 页面权限控制 120 5.7 发表微博 123 5.7.1 微博模型 123 5.7.2 发表微博 ...

    Node.js+开发指南

    5.5.4 使用Bootstrap 104 5.6 用户注册和登录 107 5.6.1 访问数据库 107 5.6.2 会话支持 110 5.6.3 注册和登入 111 5.6.4 页面权限控制 120 5.7 发表微博 123 5.7.1 微博模型 123 5.7.2 ...

    portfolio-site:一个用于显示我的投资组合,历史和目标的项目

    为了查看某些组件的工作原理,我不得不深入研究模块文件本身。 我在公共index.html中创建了一个加载动画,以便访问者在等待时有一个加载指示器,它创建了一个不错CSS淡入淡出动画以使index.html消失并在应用程序的...

    自己动手写的javascript前端等待控件

    等待控件在网上搜有好多种,但是都很复杂,不一定用的顺手,再说我的项目是bootstrap的原因,又不敢轻易使用第三方控件,怕不兼容,于是自己动手写了个等待控件,其技术点包括动态加载CSS,javascript的命名空间,...

    ngrid:企业的角度网格

    使用您想要的所有流行语: 企业级高度可扩展UI不可知功能已加载有关完整的文档,演练和示例-快速启动/设置使用内置的原理图: ng add @pebula/ngrid @pebula/ngrid包含辅助软件包/插件(例如: @pebula/ngrid/...

    Codeigniter-login-auth-admin

    2):在ci如何加载css,js,image等等公共文件,在对应的模块中helper中可以扩展url,我的扩展如下(我是使用bootstrap进行搭建后台):admin/helpers/MY_url_helper.php 3):在layout定义layout视图文件,具体看...

    深入探索.NET框架内部了解CLR如何创建运行时对象

    本文使用下列技术:.NETFramework,C#本页内容CLR启动程序(Bootstrap)创建的域系统域(SystemDomain)共享域(SharedDomain)默认域(DefaultDomain)加载器堆(LoaderHeaps)类型原理对象实例方法表基实例大小方法...

    单点登录源码

    Spring+SpringMVC+Mybatis框架集成公共模块,包括公共配置、MybatisGenerator扩展插件、通用BaseService、工具类等。 &gt; zheng-admin 基于bootstrap实现的响应式Material Design风格的通用后台管理系统,`zheng`...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题40.jQuery中页面加载完毕事件 Java面试题41.jQuery中Ajax和原生js实现Ajax的关系 Java面试题42.简单说一下html5 Java面试题43.简单说一下css3 Java面试题44.bootstrap的是什么 Java面试题45.什么是框架 ...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题40.jQuery中页面加载完毕事件.mp4 │ Java面试题41.jQuery中Ajax和原生js实现Ajax的关系.mp4 │ Java面试题42.简单说一下html5.mp4 │ Java面试题43.简单说一下css3.mp4 │ Java面试题44.bootstrap的是...

    ks

    Doks删除未使用CSS,预取链接并延迟加载图像。 SEO就绪。 对结构化数据,打开的图形和Twitter卡使用明智的默认设置。 或根据自己的喜好轻松更改SEO设置。 开发工具。 充满信心地编码。 检查样式,脚本和标记是否...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    JQuery事件之页面框架和加载后自动执行 JQuery扩展以及自动执行函数的应用 JQuery阻止事件发生 JQuery扩展 作业 第18周 内容概要 JS正则详解 JS正则详解之验证 组件BootStrap、EasyUI、JQueryUI 插件轮播 Django_...

    python入门到高级全栈工程师培训 第3期 附课件代码

    08 类的装饰器的基本原理 09 类的装饰器增强版 10 类的装饰器的应用 11 自定制property 12 自定制property流程分析 13 自定制property实现延迟计算功能 14 property补充 15 元类介绍 16 自定义元类 17 函数复习 18 ...

Global site tag (gtag.js) - Google Analytics