java疫苗之殇?关于类加载器的一些思考

2023-10-25 14:10
文章标签 java 加载 思考 疫苗 之殇

本文主要是介绍java疫苗之殇?关于类加载器的一些思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

近日疫苗之殇闹得沸沸扬扬,究其原因是因为长春长生生物公司随意改动制药工艺,不管注射了这种疫苗会不会对身体有太大的影响,但是这严重影响了国民对医药的信任,可能导致国民不愿注射疫苗,对传染病防控带来极大打击,对公众的生命安全带来极大的风险。

对于此事,java王国却在偷乐,他们早就有一个完善的方案来避免这种事情发生。从上到下,java王国政府都建有大大小小的药厂,它们管这些药厂叫做ClassLoader(类加载器),其中全国最大、最权威的药厂叫做Bootstrap ClassLoader,次大一点的药厂叫做Extension ClassLoader,这两个药厂管理着java王国里面对公众生命安全最重要、最基本的药物。当然了java王国贵为编程语言第一大国,仅靠这两家厂生产和管理这些药物是远远不够的,对于那些不那么重要的药,不会对公众健康造成很大影响的药物,java王国允许他们建造自己的ClassLoader,这些ClassLoader叫做Application ClassLoader,那么这一小部分人就可以使用这个药房的药了。以上的药厂都属于中央或者地方政府的制药工厂。然后接下来,对于那些实力强劲的企业如java第一集团apache旗下子公司tomcat,他们完全有能力自己制药,并且能获得举国上下的认可和使用。
这里写图片描述

他们实行了什么政策可以保证疫苗的安全呢?他们出台了“双亲委托模型”管理办法,要求低一级的药厂或者药房在制造药物的时候,必须交由它的上一级审核和制造,如果上一级认为这种药物不会危害生命,完全可以交由下级药厂制造,那么就会把这个申请打回下一级。

举个例子,假如现在我想要一种叫做Object的药,我会先到Application去买药,而Application不管三七二十一,直接请求他的上级Extention ,而Extention ClassLoader也是同样请求Bootstrap ,Bootstrap 发现这种药是生命的必需药物,当然应该由自己生产,于是就把Object药物再逐层递交到我手上。请求链是这样的:Application–>Extention–>Bootstrap
这样做有什么用呢?可以防止一些不法分子生产危害系统的药物,譬如有些不怀好意的人仿制了Object药,并且这种药具有破坏性,但是系统必须保证它使用的是Bootstrap 制造的,否则王国最基本的行为都无法保证了。

java王国做了这么多事,无非就是想保证一个命名空间。如何确定一个类的命名空间呢?有一个办法:加载它的类加载器,以及委托这个类加载器的子类加载器构成一个命名空间。创造命名空间主要是为了隔离不同命名空间的类之间的互相影响。体现这点的一个例子就是Tomcat的类加载器:
这里写图片描述
tomcat的类加载自己实现了Common、Catalina、Shared、WebApp等类加载器,主要是为了方便管理jar包。如放在tomcat的common文件夹下的jar包由Common ClassLoader加载,这会有什么效果呢?这个tomcat下的每一个应用都可以使用common里面的类了。而放在web app下的lib下的jar包,由于命名空间只是webApp+jasper,因此仅限这个web app去访问这个类。
当然凡事也有例外,为什么这么说呢。有时候有些大药厂忙不过来,他们只会会定标准,让下面的药厂去实现,如JDBC。这些JDBC的标准接口就会由Bootstrap去加载,其命名空间是Bootstrap,而具体的实现类可能由Application去加载(命名空间为Application),那么Bootstrap就无法找到JDBC的具体实现了。为此,java王国开辟了特别的通道:线程上下文的ClassLoader:Thread.currentThread().getContextClassLoader()。线程会借此拿到当前线程上下文的ClassLoader去加载具体的JDBC的实现。
(完)

题外话
最近在读spring的源码,发现一个方法ClassUtils#getDefaultClassLoader,是一个获取类加载器的方法,这个方法写得挺有意思,引起了对类加载器的一些回忆。于是就有了这篇文章。
这里写图片描述
读过周志明的<<深入了解java虚拟机>>的(相信这是很多人接触JVM的第一本读物吧)会发现这其实就是里面提到的双亲委托模型的第二次被破坏,它是由这个模型本身的缺陷所导致的。原文的内容是:
双亲委派模型的第二次“被破坏”是这个模型自身的缺陷所导致的,双亲委派模型很好地解决了各个类加载器的基础类统一问题(越基础的类由越上层的加载器进行加载),基础类之所以被称为“基础”,是因为它们总是作为被调用代码调用的API。但是,如果基础类又要调用用户的代码,那该怎么办呢。

新开了个微信公众号,文章会第一时间发布到此公众号,欢迎关注
这里写图片描述

这篇关于java疫苗之殇?关于类加载器的一些思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/283104

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2