Java打破双亲委派机制
1.自定义加载器
沿用双亲委派机制自定义类加载器很简单,只需继承ClassLoader类并重写findClass方法即可。
①先定义一个待加载的类Test,它很简单,只是在构建函数中输出由哪个类加载器加载。
public class Test {public Test(){System.out.println(this.getClass().getClassLoader().toString());}
}
②定义一个TestClassLoader类继承ClassLoader,重写findClass方法,此方法要做的事情是读取Test.class字节流并传入父类的defineClass方法即可。然后就可以通过自定义累加载器TestClassLoader对Test.class进行加载,完成加载后会输出“TestLoader”。
public class TestClassLoader extends ClassLoader {private String name;public TestClassLoader(ClassLoader parent, String name) {super(parent);this.name = name;}@Overridepublic String toString() {return this.name;}@Overridepublic Class<?> findClass(String name) {InputStream is = null;byte[] data = null;ByteArrayOutputStream baos = new ByteArrayOutputStream();try {is = new FileInputStream(new File("d:/Test.class"));int c = 0;while (-1 != (c = is.read())) {baos.write(c);}data = baos.toByteArray();} catch (Exception e) {e.printStackTrace();} finally {try {is.close();baos.close();} catch (IOException e) {e.printStackTrace();}}return this.defineClass(name, data, 0, data.length);}public static void main(String[] args) {TestClassLoader loader = new TestClassLoader(TestClassLoader.class.getClassLoader(), "TestLoader");Class clazz;try {clazz = loader.loadClass("test.classloader.Test");Object object = clazz.newInstance();} catch (Exception e) {e.printStackTrace();} }}
2.打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass方法即可
部分源码如下:
protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {// 这一块实现了双亲委派的机制if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}...}}
①定义Test类。
public class Test {public Test(){System.out.println(this.getClass().getClassLoader().toString());}
}
②重新定义一个继承ClassLoader的TestClassLoaderN类,这个类与前面的TestClassLoader类很相似,重写了loadClass方法,默认的loadClass方法是实现了双亲委派机制的逻辑,即会先让父类加载器加载,当无法加载时才由自己加载。这里为了破坏双亲委派机制必须重写loadClass方法,自己实现的方法中没有双亲委派的逻辑。
public class TestClassLoaderN extends ClassLoader {@SneakyThrows@Overridepublic Class<?> loadClass(String name){String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";InputStream is = getClass().getResourceAsStream(fileName);if(is == null) {return super.loadClass(name);}byte[] b = new byte[is.available()];is.read(b);return defineClass(name, b, 0, b.length);}public static void main(String[] args) {TestClassLoaderN loader = new TestClassLoaderN();Class clazz;try {clazz = loader.loadClass("com.boot.myself.TestClassLoaderN");Object object = clazz.newInstance();System.out.println(object.getClass());System.out.println(object instanceof com.boot.myself.TestClassLoaderN);} catch (Exception e) {e.printStackTrace();}}}//结果
class com.boot.myself.TestClassLoaderN
false // 虽然类名一致,但是加载类的加载器不同,结果是false
Java打破双亲委派机制相关推荐
- 【JVM】Java类的加载流程以及双亲委派,全盘托管,以及如何打破双亲委派机制
JVM基础生命周期流程图 只有main()方法的java程序执行流程 classLoader.loadClass()的类加载流程(除引导类,所有类都一样) 加载:通过IO查找读取磁盘上的字节码文件,在 ...
- 如何打破双亲委派机制
双亲委派机制 第一次知道何为打破双亲委派机制是通过阅读周志明的<深入理解Java虚拟机>,我们知道双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器 ...
- 【有料】面试必备:什么时候要打破双亲委派机制?什么是双亲委派? (图解+秒懂+史上最全)
面试题:什么时候要打破双亲委派机制 来自社群的两个面试题,其实也是两个基础的 面试题,大家一定要掌握 社群问题: 先说下第一题的结论 场景1: 如果委托类没有实现接口的话,就不能使用newProxyI ...
- 双亲委派机制以及打破双亲委派机制
双亲委派机制以及打破双亲委派机制 双亲委派机制 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存中生成class对象,而且加载某个类的c ...
- 打破双亲委派机制有什么用_1.4 打破双亲委派机制
什么是打破双亲委派机制呢? 那么这里第一步, 我们需要知道什么是双亲委派机制? 前面已经说了什么是双亲委派机制了, 那打破是怎么回事呢? 比如, 我现在有一个自定义类加载器, 加载的是~/com/lx ...
- 如何打破双亲委派机制?
上文:jdk-Launcher源码学习 背景 上文说过,jdk是通过双亲委派机制实现类的加载,但是这个加载效率及场景存在弊端,所以本文借鉴tomcat的实现方式去打破双亲委派机制实现自定义类加载器来模 ...
- 面试必备:什么时候要打破双亲委派机制?什么是双亲委派? (图解+秒懂+史上最全)
文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...
- JVM类加载机制、双亲委派机制、自定义类加载器、打破双亲委派机制
1.类加载器 站在Java虚拟机的角度看,只有两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现(HotSpot虚拟机.JDK8中), ...
- Tomcat打破双亲委派机制
打破双亲委派 沙箱安全机制示例,尝试打破双亲委派机制,用自定义类加载器加载自己实现的 java.lang.String.class public class MyClassLoaderTest {st ...
最新文章
- Java线程---休眠问题来看并发执行
- linux系统安全设置
- s:property 获取 ValueStack中的值
- java导出highcharts_java实现highcharts导出图片至excel
- 阅读代码工具:Visual Studio Code
- 老衣的微服务实践简要指引2017版
- [html] 用一个div模拟textarea的实现
- 自动驾驶路径规划论文解析(4)
- php如何处理耗时的任务,PHP如何在请求完毕后继续处理耗时任务
- 均衡器算法_必须像算法一样对算法进行仔细调整。 怎么样? 算法均衡器
- unity shader可视化工具——Shader Graph
- 信息安全概论复习笔记
- vue+cropperjs实现图片裁剪功能——PC端+移动端——技能提升
- qua数据统计缺失问题之终结
- 原画师一般用什么软件画画?
- DNBFT共识——一种可动态调节网络节点数的PBFT优化方案
- 报错Duplicate entry ‘值‘ for key ‘字段名‘的解决解决方法
- uboot usb设备驱动
- 程序员晒端午福利,网友:看了你的福利我想摔手机
- 董明珠再砸150亿,欲建立自主创新智能制造产业基地
热门文章
- 使用低通滤波器去除基线漂移(MATLAB代码)
- 工作四年,分享15个对Java 程序员有用的库
- 奥维地图怎么标注文字_如何在奥维地图上准确地告诉别人“我在哪?”
- git 分支操作总结
- 洛谷:P1460 [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins(DFS)
- Base编码(贝斯家族)
- 山东大学计算机组成与设计实验七 节拍脉冲发生器时序电路
- 开源协议MIT、BSD、Apache
- 【Matlab】自定义函数的几种方法
- 启贤老师:数字货币投资市场何为盈利 实仓客户心路历程