karaf内嵌文件服务器,关于OSGI(Karaf) Classloader的几点说明

1. Java ClassLoader

Java通过Classloader加载Class,Classloader之间相互隔离。隔离真正的意思是:不同的Classloader可以加载相同的class定义,并且被jvm认定为不同的class。很多人对隔离有误解,认为不同的Classloader之间不能相互访问,这其实并不准确。可以这么理解:Classloader只是一个普通的Java类,加载的class集合是它的一个成员变量。如果一个Classloader中维护了另一个Classloader的引用,自然可以通过接口调用查找并使用另一个Classloader加载的类,双亲委派使用的正式这种机制。

双亲委派这名字乍一听好像是说你有父亲、母亲两个Classloader,你可以委派他们两个先去加载class,他们处理不了的你再处理。如果真这么理解就全错了。首先,他们不是两个,可能是n个;其次,他们不是你的父母,他们是整个jvm共享的Classloader;第三,他们谁的父母都不是,因为你和他们没有血缘(别人也没有),你不是双亲Classloader的子类。

双亲委派的英文为parent delegation,指的是每个Classloader都有一个getParent方法获取上一级的Classloader。查找类时,先调用parent Classloader查找,如果找不到在用自身的Classloader查找。层级关系如下:

14b40b570043?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

parent delegation

双亲委派实际上只是引用关系,上述bootrasp、extension、application Classloader之间关系均属此类。再来看另外一张图:

14b40b570043?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

自定义Classloader

bootrasp、extension、application Classloader在jvm中只有一个实例,多个用户自定义的Classloader共享此实例,完成公共部分加载。

2. OSGI Classloader

在OSGI中,每一个Bundle有一个单独的Classloader实例。更具体点,BundleWiringImpl中定义了一个BundleClassLoader,每当加载一个bundle时,框架创建一个BundleClassLoader实例负责该bundle相关class的加载工作。

BundleClassLoader的加载顺序如下:

如class在 java.* package中,委托Bootstrap Classloader处理;

如class定义在 OSGi 框架中启动委托列表(org.osgi.framework.bootdelegation)中,则将加载请求委托给Bootstrap Classloader处理;

如class在 Import-Package 定义的package中,则框架找到导出此package的 Bundle 的 Class Loader,交其处理 。

如class属于在 Require-Bundle 中定义的 Bundle,则框架找到导出此package的Bundle的ClassLoader,交其处理。

Bundle 搜索自己的类资源 ( 包括 Bundle-Classpath 里面定义的类路径和属于 Bundle 的 Fragment 的类资源);

若类在 DynamicImport-Package 中定义,则开始尝试在运行环境中寻找符合条件的 Bundle 。

Bundle之间隔离,但如果存在import关系又可以委托给相应export的classloader处理。实现上无非是维护了多个import bundle的Classloader,查找时调用其find方法实现。

需要注意的是:查找时优先查找Import-Package、Require-Bundle中的类,随后才是查找Bundle自己的类。这里又引入另外一个疑问,Embed-Dependency使用问题。

简单来说,如果一个Bunlde 需要使用protobuf-java.jar,有如下两种使用方式:

普通的dependency方式使用,如下图的Component C的使用方式。

Embed-dependency方式使用,如下图的ComponentA、ComponentB,此时将protobuf-java做为Bundle自身的一部分使用。

14b40b570043?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

embed-dependency

按类加载的顺序,如果先加载Import-Package随后加载自身的Class,在外部存在protobuf-java,又有内嵌的protobuf-java时,如何做到使用自己的而非外部的呢?答案是在Embed-dependency中的jar并不会出现在Import-Package中。

最后再来讲一下,为什么每个bundle需要分配单独的Classloader,解决什么问题。在我看来,最主要的原因有如下两个:

定制导出类。非osgi环境下,所有package中的java类都将被导出,无法限定哪些只能jar内使用,哪些是需要export出去的。存在各种误用,耦合使用情况。

多版本控制。非osgi环境下,一个jvm对于一个类只允许存在一个版本。osgi中每个bundle是独立开发演进的,可能出现同时存在多个版本。

3. 参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse debug(程序调试)单步执行 简述

eclipse debug(程序调试)单步执行 简述 1.在需要程序停止的地方 双击打一个断点 2.右键以debug模式执行(有个虫子标志的选项) 3.单步执行 观察变量的变化 如图所示: debug常见问题: 1.Variables(变量区…

微信小程序~如何设置页面的背景色

微信小程序~如何设置页面的背景色 众所周知,微信小程序每个页面由.json,.scss,.ts,.wxml这四个文件组成。 有的小伙伴会发现,需要给页面加背景色的时候,只需在此页面的.scss文件中写个page{background-colo…

Java JDK 自带排序(Arrays.sort(数组名))与自行编写的降序

JDK 自带排序(Arrays.sort(数组名))与自行编写的降序 jdk 自带的排序 Arrays.sort(数组名) 只能进行升序排列 可以与自己写的降序 配合使用 import java.util.Arrays;public class Test1 {//jdk 自带升序public static void m1(int [] arr1) {Arrays.sor…

javaee 中遇到的jdk自带的异常(Exception)

javaee 中遇到的异常(Exception) 如果输入了类型不匹配的数据,则会报InputMismathException(输入不匹配异常) 如果访问超过数组范围的下标将会报数组下标越界异常:ArrayIndexOutOfBoundsException ( 数组越界异常) 在多态的向下转…

Java 访问权限修饰符简述

访问权限修饰符简述 1.类的访问修饰符 public 最大访问权限,本项目中的任何位置都可以访问 默认不写 :包级别的访问权限,智能在同包中访问 package com.qfedu.test2;//public修饰的类 public class A {public static void main(String[] arg…

java super关键字简述

java super关键字简述 super关键字访问父类属性,访问权限必须是允许的super关键字访问父类属性,访问权限必须是允许的当创建子类对象时,默认调用父类的无参构造方法,除非显式调用父类的有参构造方法,也就是说**子类创建…

c++ char* 改变长度重新赋值_[C/C++] 2 :分析下列代码有什么问题?

题目分析下面代码有什么问题&#xff1f;void test2() { char string[10], str1[10]; int i; for(i0; i<10; i) { str1 a; } strcpy( string, str1 ); } 解答代码无法通过编译。因为数组名str1为 char *const类型的右值类型&#xff0c;根本不能赋值。即使想对数组的第…

hal 双串口同时接收丢失数据_【STM32Cube_06】使用USART发送和接收数据(查询模式)...

寻求更简洁舒适的阅读体验&#xff0c;请移步Mculover666的个人博客&#xff1a;【STM32Cube_06】使用USART发送和接收数据&#xff08;查询模式&#xff09;​www.mculover666.cn本篇文章主要介绍如何使用STM32CubeMX初始化STM32L431RCT6的USART&#xff0c;并使用查询模式发送…

什么叫冷备用状态_新密5P加工中心冷油机生产厂家电话【瀚信德】

新密5P加工中心冷油机生产厂家电话【瀚信德】以上如有异常&#xff0c;请尽快通知分司派维修人员处理。油冷机的工作原理有什么油冷机也叫冷油机&#xff0c;根据制冷系统原理&#xff0c;低温低压的液态冷媒在蒸发器里面与周围水进行热交换蒸发器吸收油的热量&#xff0c;蒸发…

多线程 循环 锁_大多数人还不清楚的iOS多线程

你不知道的的 iOS 多线程程序员用有限的生命去追求无限的知识。有言在先首先我不是故意要做标题党的&#xff0c;也不是我要炒冷饭&#xff0c;我只是想换个姿势看多线程&#xff0c;本文大部分内容在分析如何造死锁&#xff0c;奈何功力尚浅&#xff0c;然而再浅&#xff0c;也…

学校为什么要单位接收函_学校、小区运动场为什么要选择塑胶跑道

随着人们生活水平的不断提高&#xff0c;科技的日新月异&#xff0c;各行各业都向着更加健康环保安全舒适的方向迈进。就拿小区、学校的运动场所地坪为例&#xff0c;传统的“沙土跑道”已经被运动塑胶跑道所替代。那么运动场为什么会选择塑胶跑道呢&#xff1f; 塑胶跑道又称全…

pitstop插件使用说明_【学员分享】程序员效率神器,最常用VIM插件安装大全

相信大家多次被推荐用vim作为编辑程序&#xff0c;知道vim编辑有很多优点&#xff0c;但是vim初始界面太原始了&#xff0c;安装了之后只能用来编辑&#xff0c;如果要运行就需要退出去运行&#xff0c;麻烦死了。回想用现成的IDE是多么的舒服。但是为了更好的学习&#xff0c;…

JVM思维导图、正则表达式符号图、企业内部开发流程图

JVM思维导图、正则表达式符号图、企业内部开发流程图 1.JVM思维导图&#xff1a; 2.正则表达式符号图&#xff1a; 3.企业内部开发流程图&#xff1a;

萧县机器人_全国总决赛第一名!萧县杨楼的这位学生厉害了

&#xfeff; 提示&#xff1a;点击上方"萧县关注"↑免费订阅本刊点击上方关注我们&#xff0c;免费订阅更多精彩内容&#xfeff;&#xfeff;&#xfeff;&#xfeff;&#xfeff;&#xfeff;&#xfeff;&#xfeff;&#xfeff;&#xfeff;&#xfeff;&…

关于JSP页面无法加载css,游览器访问jsp页面样式未生效导致乱序

关于JSP页面无法加载css&#xff0c;游览器访问jsp页面样式未生效导致乱序 1.修改自己过滤器中对编码格式的修改 如图&#xff1a; 代码如下&#xff1a; public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOE…

将视图转为image_JavaScript二进制数组(2)TypedArray视图

ArrayBuffer对象作为内存区域可以存放多种类型的数据。同一段内存&#xff0c;不同数据有不同的解读方式&#xff0c;这种解读方式称为“视图&#xff08;view&#xff09;”。ArrayBuffer有两种类型的视图&#xff0c;一种是类型化数组视图&#xff08;TypedArray&#xff09;…

解决IDEA中maven工程的jsp、jstl依赖导入了 ,但是 jsp页面的uri却不提示(手动输上也报红)

解决IDEA中maven工程的jsp、jstl依赖导入了 &#xff0c;但是 jsp页面的uri却不提示&#xff08;手动输上也报红&#xff09; 出现原因&#xff1a;idea内有缓存 解决办法&#xff1a;File --> Invalidate Caches / Restart… --> lnvalidate and Restart idea版本&#…

空格 过滤多个_CAD选择过滤器的运算符如何使用?

选择过滤器FILTER在CAD早期版本中是扩展工具的一个功能&#xff0c;到了高版本变成标配的功能&#xff0c;但在浩辰CAD的菜单或工具面板中我还找到选择过滤器的命令。浩辰CAD面板、右键菜单和特性面板倒是都提供了快速选择的功能&#xff0c;快速选择功能应该是借鉴选择过滤器开…

各层作用_终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的

一&#xff1a;背景1. 讲故事前几天有位朋友让我有时间分析一下 aspnetcore 中为什么向 ServiceCollection 中注入的 Class 可以做到 Singleton&#xff0c;Transient&#xff0c;Scoped&#xff0c;挺有意思&#xff0c;这篇就来聊一聊这一话题&#xff0c;自从 core 中有了 S…

权限管理系统_在Gitee狂揽11K Star!这个SpringCloud的权限管理系统你必须知道

SpringCloud 大家都很熟悉了&#xff0c;它作为一套完整的微服务解决方案&#xff0c;广受 Java 开发者们的好评&#xff0c; 今天就为大家介绍一款 Gitee 上的王牌项目&#xff0c;基于 SpringCloud 的权限管理系统——Pig。项目名称&#xff1a;Pig项目作者&#xff1a;pig4c…