JVM(四)打破双亲委派和SPI机制
前言:
我们都知道判断两个类是不是同一个,要根据类加载器和全限定名。这是为什么呢?为什么不同的类加载器加载同一个类是不同的呢?
答案就是,不同的类加载器所加载的类在方法区的存储空间是不同的即InstanceKlass的不同。不同类加载器之间的空间是分隔开的。同一个类在一个类加载器中只会加载一次。
双亲委派的弊端,无法做到不委派,也无法向下委派。
沙箱安全:
虽然JVM让我们用一些方式打破双亲委派,但是对于系统的核心类库JVM是会进行保护不让篡改的。如果自己写了和核心类库相同的类,在运行的时候会出错。
一:自定义类加载器打破双亲委派,不委派双亲
我们从上篇中有介绍classLoader.loadClass的时候会进行双亲委派进行加载,如果双亲都找不到指定类会调用findClass方法。
classLoader类中的loadClass有默认的实现就是双亲委派逻辑,findClass没有默认的实现需要自定义类加载器来实现。
所以如果只是使用一个自定义类加载器而不打破双亲委派,只要继承ClassLoader来重写findClass。如果想打破双亲委派,也要重写loadClass方法了,做到不委派。
二:SPI机制向下委派
SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。
这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。我们先通过一个很简单的例子来看下它是怎么用的。SPI是实现向下委派的。
1:接口类模块
就一个接口,让其它模块通过Maven引用。

2:第一个接口实现类模块
只有一个实现类,在resources下面增加META-INF/services文件夹,文件夹下面增加一个文本文件,文件名是实现的接口全路径,文件里面的内容是实现的类的全路径。


3:第二个接口实现类模块


接下来我们开始使用SPI机制

我们在pom中引入第一个实现类模块:

上述main方法执行的结果就是对应实现类的执行结果。

当引入多个实现类的时候,都可以执行。

JVM(四)打破双亲委派和SPI机制的更多相关文章
- tomcat学习步骤,附带打破双亲委派模型企业应用实战
1. tomcat入门 入门模块仅做学习大纲梳理,忽略了具体操作指引. Tomcat的三种部署模式: 简单架构模型 连接器的非阻塞模式(NIO) 通道(Channel).缓冲区(Buffer).选择器 ...
- JVM类加载与双亲委派机制被打破
前言 前文已经讲了虚拟机将java文件编译成class文件后的格式:JVM虚拟机Class类文件研究分析 java文件经过编译,形成class文件,那么虚拟机如何将这些Class文件读取到内存中呢? ...
- Tomcat 类加载器打破双亲委派模型
我们分为4个部分来探讨: 1. 什么是类加载机制? 2. 什么是双亲委任模型? 3. 如何破坏双亲委任模型? 4. Tomcat 的类加载器是怎么设计的? 我想,在研究tomcat 类加载之前,我们复 ...
- 深入探究JVM之类加载与双亲委派机制
@ 目录 前言 类的生命周期 加载 验证 准备 解析 初始化 案例一 案例二 案例三 案例四 类加载器 类加载器和双亲委派模型 破坏双亲委派模型 第一次 SPI Tomcat OSGI 总结 前言 前 ...
- 【JVM第二篇--类加载机制】类加载器与双亲委派模型
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.什么是类加载器 在类加载过程中,加载阶段有一个动作是"通过一个类的全限 ...
- 深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型.类加载和连接的过程都是在运行期间完成的. 二. 类的 ...
- jvm双亲委派机制详解
双亲委派机制 记录一下JVM的双亲委派机制学习记录. 类加载器种类 当我们运行某一个java类的main方法时,首先需要由java虚拟机的类加载器将我们要执行的main方法所在的class文件 ...
- JVM类加载机制详解(二)类加载器与双亲委派模型
在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可 ...
- java类加载过程以及双亲委派机制
前言:最近两个月公司实行了996上班制,加上了熬了两个通宵上线,状态很不好,头疼.牙疼,一直没有时间和精力写博客,也害怕在这样的状态下写出来的东西出错.为了不让自己荒废学习的劲头和习惯,今天周日,也打 ...
随机推荐
- [TSCTF-J] relax
[TSCTF-J] relax 1.源码审计 利用扫描器可以扫到robots.txt 进入发现三个文件 flag.php heicore.php relax.php 我们只能进入relax.php 发 ...
- Hibernate实现对数据的CRUD
今天主要去看公司的老框架, CRUD用的较多,所以总结一下步骤,以免忘记的时候温习 回顾 JDBC 工作过程: 加载驱动 建立连接 定义sql,发生sql语句 执行sql语句获得执行结果 处理返回结果 ...
- Java中常见的json序列化类库 - Jackson
Jackson 介绍 Jackson框架是基于Java平台的一套数据处理工具,被称为"最好的Java Json解析器". Jackson框架包含了3个核心库:streaming,d ...
- @RequestBody,@RequestParam请求数据接收数据
一. @RequestBody 注解 @RequestBody是用于解析body中的json内容,对于我们使用时候我们需要指定Content-Type参数为application/json,标识我们需 ...
- Interface注意事项
Interface 成员声明 声明属性,默认static & final 声明方法,默认public interface Instrument { int VALUE = 5; // stat ...
- python之shutil 模块
一.shutil 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中 import shutil s ...
- java.io.NotSerializableException: org.apache.kafka.clients.consumer.ConsumerRecord
kafka 与spark集成 序列化问题 sparkConf.set("spark.serializer", "org.apache.spark.serializer.K ...
- 机器学习之shape
shape[:2] 取彩色图片的长和宽 shape[:3]取彩色图片的长和宽和通道 img.shape[0]:图像的垂直高度 img.shape[1]:图像的水平宽度 img.shape[2]:图像的 ...
- python3 处理列表嵌套字典去重
def list_dict(dictlist): def function(date): return date['ip'] dictlist_new = [] for list_dict in di ...
- Itranswarp 搭建个人 Wiki
www.swack.cn - 原文链接:Itranswarp 搭建个人 Wiki 从零开始 搭建个人Wiki站点 Itranswarp.js 是一款基于nodejs开发的博客系统,通过Apache L ...