此计算机必须为委派而被信任_如何增强 ClassLoader 双亲委派模式 ?
双亲委派模式
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 双亲委派模式 ?相关推荐
- java安全沙箱(一)之ClassLoader双亲委派机制
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...
- java类加载-ClassLoader双亲委派机制
"类加载体系"及ClassLoader双亲委派机制.java程序中的 .java文件编译完会生成 .class文件,而 .class文件就是通过被称为类加载器的ClassLoade ...
- 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制
转载自 违反ClassLoader双亲委派机制三部曲第二部--Tomcat类加载机制 前言: 本文是基于 ClassLoader双亲委派机制源码分析 了解过正统JDK类加载机制及其实现原理的基础上,进 ...
- 打破双亲委派机制有什么用_1.4 打破双亲委派机制
什么是打破双亲委派机制呢? 那么这里第一步, 我们需要知道什么是双亲委派机制? 前面已经说了什么是双亲委派机制了, 那打破是怎么回事呢? 比如, 我现在有一个自定义类加载器, 加载的是~/com/lx ...
- 此计算机必须为委派而被信任_允许受信任的用户进行委派
TechNet 库 Deployment Forefront Identity and Access Management 基础结构优化 浏览器 Microsoft Dynamics Products ...
- 双亲委派机制_面试官:双亲委派机制的原理和作用是什么?
说到双亲委派机制,就必须要先要弄清楚Java的类加载器 什么是类加载器 Java类加载器(ClassLoader)是Java运行时环境(JRE)的一部分,负责动态的将Java类加载到Java虚拟机的内 ...
- 双亲委派机制_史上三次破坏ClassLoader双亲委派机制
人既会喜逢令人羡慕的幸运,也会遭遇始料不及的失败与磨难.艰难时,不丧失美好的希望:而在成功时,不忘记感恩之心.谦虚之心:人只要有这份心态,任何时候都可以重振旗鼓. 人的一生始于心,终于心. 本篇是继上 ...
- 一次尝试绕过ClassLoader双亲委派的实验
一.文章来由 来阿里玩Java也有一个多月了,一直对Java虚拟机比较感兴趣,而ClassLoader是整个class载入过程中很重要的组件.而classloader有个双亲委派模型,师兄说这个模型不 ...
- 【JVM】Java类的加载流程以及双亲委派,全盘托管,以及如何打破双亲委派机制
JVM基础生命周期流程图 只有main()方法的java程序执行流程 classLoader.loadClass()的类加载流程(除引导类,所有类都一样) 加载:通过IO查找读取磁盘上的字节码文件,在 ...
最新文章
- HTML教程--多页面窗体
- SAP FI配置关键点
- opencv java match_OpenCV模板匹配函数matchTemplate详解
- 模式对话框与非模式对话框的区别2
- Matlab非线性拟合工具箱cftool
- HighChat动态绑定数据 数据后台绑定(三)
- Oier's little dream
- “中国工程设计大师”俞加康:为地铁耕耘“时不我待,只争朝夕”
- 分布式SQL查询引擎---presto介绍,连接器
- 目标跟踪算法MOSSE笔记
- wps怎么导入access_WPS Access 2013_access 2013下载-下载之家
- 在我的世界修改服务器吗 名字,我的世界怎么改名字
- [转载]视频格式介绍
- 商业研究(13):下厨房,从投资角度看这个项目的前景和价值
- 如何快速求一个数的所有因子数 c/c++
- 计算机键盘无法识别,键盘无法识别的解决妙招
- alt复制选区就会卡 ps_ps怎么把选区复制出来
- 【嵌入式工程师的30岁总结】 真实
- idead导入maven多模块
- 应用程序运行 Error 1706 错误
热门文章
- How to resolve error message Malformed URI literal syntax
- SAP IBASE hierarchy remove - step2 handling
- Usage of field SENDABLE in BOL entity
- 将github pages搭建的网页添加到百度搜索资源平台
- 配置表CRMC_SORG_R3ORG在SPRO里的配置路径
- 你的项目刚刚启动?是时候考虑Globalization了!
- 测试基础理论知识(二)
- 变频器lpm故障码是什么_什么是变频器软故障,如何解决?
- v8声卡调音软件_sE VOXTOON AF2评测:解决复杂跳线需求的声卡
- c语言goto语句用法_硬件工程师必知的10个C语言技巧