双亲委派模式

JVM加载类的实现方式,我们称为 双亲委托模型: 如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委托给自己的父加载器,每一层的类加载器都是如此,因此所有的类加载请求最终都应该传送到顶层的Bootstrap ClassLoader中,只有当父加载器反馈自己无法完成加载请求时,子加载器才会尝试自己加载。

双亲委派模式问题

双亲委派模式存在的问题就是不太灵活,和类的继承类似,只能继承一个类。一个 classloader 只能有一个父亲 classloader。 比如有如下的场景,我们需要加载 N 个 插件,这些插件使用自己的classloader来保证类的隔离。应用可以使用插件classloader 加载的类。其结构如下:

这样的问题就是 Plug-in 之间是从上往下是继承的关系,但是每一个 plug-in 对于 App 而言应该是同级别的关系 ,plug-in 之间应该可以相互依赖。 以上的模式显然是无法做到的。

双亲委派增强模式

双亲委派增强模式满足以下内容:

  • Plugin Class loader 加载的 jar 都是隔离的,每一个jar 使用 一个 Plugin classloader 进行加载。
  • 每一个 Plugin Class Loader 实例与其它的 实例 互为 双亲委派模式。 plugin 1 可以使用 2、3 加载的class,同理 2 也可以 1、2 加载的class。
  • AppClassLoader 可以引用 所有 plugin classloader 加载的 class。但是 plugin classloder 不能使用 AppClassloader加载的class,为单向双亲委派模式。

Plugin 如何隔离?

plugin 隔离比较简单,只要使用不同的 Plugin classloader 实例进行加载就可以隔离。

Plugin 如何互为双亲委派?

每一个 pluginclassloader实例 指定加载自己的jar,并且每一个 pluginclassloader实例 可以获取到其他的pluginclassloader实例,在加载class的时候遍历所有的其它的classloader,如果加载成功加载完成,如果没有加载成功,自己再进行加载。这样就形成了所有 plugin 互为双亲委派模式。

fat jar 如何避免plugin的依赖被其他pluginclassloader加载?

当前打包的方式很多都是 fat jar 方式,自己的依赖 jar 也会打进自己的jar中,如果两个 plugin 分别依赖了 a-0.1jar 和 a-0.2.jar 。 如果按照上面的加载方式,plug-in-1 classloader 可能会加载到 a-0.2.jar 中的class。这样就出现了问题。

比较简单处理方式,在打包的时候可以把class 文件名称记录在 MANIFEST.MF 中,依赖 jar 不进行记录 ,这样每一个plugin classloader 对应加载的那些类就可以解析出来。

plug-in-1 classloader 加载class 过程如下:

  • 识别这个class 在 其它的 classloader 中是否支持加载,判断的依据就是 classloader 解析的 class记录是否存在此class ,如果存在就使用其他的 plug-in classloader 进行加载。否则自己进行加载。

因为依赖jar中 class 没有进行记录,所以一直会使用自己的classloader进行加载。

参考 SOFA-ark 的classloader 模块 PluginClassLoader.java

此计算机必须为委派而被信任_如何增强 ClassLoader 双亲委派模式 ?相关推荐

  1. java安全沙箱(一)之ClassLoader双亲委派机制

    java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...

  2. java类加载-ClassLoader双亲委派机制

    "类加载体系"及ClassLoader双亲委派机制.java程序中的 .java文件编译完会生成 .class文件,而 .class文件就是通过被称为类加载器的ClassLoade ...

  3. 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制

    转载自 违反ClassLoader双亲委派机制三部曲第二部--Tomcat类加载机制 前言: 本文是基于 ClassLoader双亲委派机制源码分析 了解过正统JDK类加载机制及其实现原理的基础上,进 ...

  4. 打破双亲委派机制有什么用_1.4 打破双亲委派机制

    什么是打破双亲委派机制呢? 那么这里第一步, 我们需要知道什么是双亲委派机制? 前面已经说了什么是双亲委派机制了, 那打破是怎么回事呢? 比如, 我现在有一个自定义类加载器, 加载的是~/com/lx ...

  5. 此计算机必须为委派而被信任_允许受信任的用户进行委派

    TechNet 库 Deployment Forefront Identity and Access Management 基础结构优化 浏览器 Microsoft Dynamics Products ...

  6. 双亲委派机制_面试官:双亲委派机制的原理和作用是什么?

    说到双亲委派机制,就必须要先要弄清楚Java的类加载器 什么是类加载器 Java类加载器(ClassLoader)是Java运行时环境(JRE)的一部分,负责动态的将Java类加载到Java虚拟机的内 ...

  7. 双亲委派机制_史上三次破坏ClassLoader双亲委派机制

    人既会喜逢令人羡慕的幸运,也会遭遇始料不及的失败与磨难.艰难时,不丧失美好的希望:而在成功时,不忘记感恩之心.谦虚之心:人只要有这份心态,任何时候都可以重振旗鼓. 人的一生始于心,终于心. 本篇是继上 ...

  8. 一次尝试绕过ClassLoader双亲委派的实验

    一.文章来由 来阿里玩Java也有一个多月了,一直对Java虚拟机比较感兴趣,而ClassLoader是整个class载入过程中很重要的组件.而classloader有个双亲委派模型,师兄说这个模型不 ...

  9. 【JVM】Java类的加载流程以及双亲委派,全盘托管,以及如何打破双亲委派机制

    JVM基础生命周期流程图 只有main()方法的java程序执行流程 classLoader.loadClass()的类加载流程(除引导类,所有类都一样) 加载:通过IO查找读取磁盘上的字节码文件,在 ...

最新文章

  1. HTML教程--多页面窗体
  2. SAP FI配置关键点
  3. opencv java match_OpenCV模板匹配函数matchTemplate详解
  4. 模式对话框与非模式对话框的区别2
  5. Matlab非线性拟合工具箱cftool
  6. HighChat动态绑定数据 数据后台绑定(三)
  7. Oier's little dream
  8. “中国工程设计大师”俞加康:为地铁耕耘“时不我待,只争朝夕”
  9. 分布式SQL查询引擎---presto介绍,连接器
  10. 目标跟踪算法MOSSE笔记
  11. wps怎么导入access_WPS Access 2013_access 2013下载-下载之家
  12. 在我的世界修改服务器吗 名字,我的世界怎么改名字
  13. [转载]视频格式介绍
  14. 商业研究(13):下厨房,从投资角度看这个项目的前景和价值
  15. 如何快速求一个数的所有因子数 c/c++
  16. 计算机键盘无法识别,键盘无法识别的解决妙招
  17. alt复制选区就会卡 ps_ps怎么把选区复制出来
  18. 【嵌入式工程师的30岁总结】 真实
  19. idead导入maven多模块
  20. 应用程序运行 Error 1706 错误

热门文章

  1. How to resolve error message Malformed URI literal syntax
  2. SAP IBASE hierarchy remove - step2 handling
  3. Usage of field SENDABLE in BOL entity
  4. 将github pages搭建的网页添加到百度搜索资源平台
  5. 配置表CRMC_SORG_R3ORG在SPRO里的配置路径
  6. 你的项目刚刚启动?是时候考虑Globalization了!
  7. 测试基础理论知识(二)
  8. 变频器lpm故障码是什么_什么是变频器软故障,如何解决?
  9. v8声卡调音软件_sE VOXTOON AF2评测:解决复杂跳线需求的声卡
  10. c语言goto语句用法_硬件工程师必知的10个C语言技巧