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打破双亲委派机制相关推荐

  1. 【JVM】Java类的加载流程以及双亲委派,全盘托管,以及如何打破双亲委派机制

    JVM基础生命周期流程图 只有main()方法的java程序执行流程 classLoader.loadClass()的类加载流程(除引导类,所有类都一样) 加载:通过IO查找读取磁盘上的字节码文件,在 ...

  2. 如何打破双亲委派机制

    双亲委派机制 第一次知道何为打破双亲委派机制是通过阅读周志明的<深入理解Java虚拟机>,我们知道双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器 ...

  3. 【有料】面试必备:什么时候要打破双亲委派机制?什么是双亲委派? (图解+秒懂+史上最全)

    面试题:什么时候要打破双亲委派机制 来自社群的两个面试题,其实也是两个基础的 面试题,大家一定要掌握 社群问题: 先说下第一题的结论 场景1: 如果委托类没有实现接口的话,就不能使用newProxyI ...

  4. 双亲委派机制以及打破双亲委派机制

    双亲委派机制以及打破双亲委派机制 双亲委派机制 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存中生成class对象,而且加载某个类的c ...

  5. 打破双亲委派机制有什么用_1.4 打破双亲委派机制

    什么是打破双亲委派机制呢? 那么这里第一步, 我们需要知道什么是双亲委派机制? 前面已经说了什么是双亲委派机制了, 那打破是怎么回事呢? 比如, 我现在有一个自定义类加载器, 加载的是~/com/lx ...

  6. 如何打破双亲委派机制?

    上文:jdk-Launcher源码学习 背景 上文说过,jdk是通过双亲委派机制实现类的加载,但是这个加载效率及场景存在弊端,所以本文借鉴tomcat的实现方式去打破双亲委派机制实现自定义类加载器来模 ...

  7. 面试必备:什么时候要打破双亲委派机制?什么是双亲委派? (图解+秒懂+史上最全)

    文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...

  8. JVM类加载机制、双亲委派机制、自定义类加载器、打破双亲委派机制

    1.类加载器 站在Java虚拟机的角度看,只有两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现(HotSpot虚拟机.JDK8中), ...

  9. Tomcat打破双亲委派机制

    打破双亲委派 沙箱安全机制示例,尝试打破双亲委派机制,用自定义类加载器加载自己实现的 java.lang.String.class public class MyClassLoaderTest {st ...

最新文章

  1. Java线程---休眠问题来看并发执行
  2. linux系统安全设置
  3. s:property 获取 ValueStack中的值
  4. java导出highcharts_java实现highcharts导出图片至excel
  5. 阅读代码工具:Visual Studio Code
  6. 老衣的微服务实践简要指引2017版
  7. [html] 用一个div模拟textarea的实现
  8. 自动驾驶路径规划论文解析(4)
  9. php如何处理耗时的任务,PHP如何在请求完毕后继续处理耗时任务
  10. 均衡器算法_必须像算法一样对算法进行仔细调整。 怎么样? 算法均衡器
  11. unity shader可视化工具——Shader Graph
  12. 信息安全概论复习笔记
  13. vue+cropperjs实现图片裁剪功能——PC端+移动端——技能提升
  14. qua数据统计缺失问题之终结
  15. 原画师一般用什么软件画画?
  16. DNBFT共识——一种可动态调节网络节点数的PBFT优化方案
  17. 报错Duplicate entry ‘值‘ for key ‘字段名‘的解决解决方法
  18. uboot usb设备驱动
  19. 程序员晒端午福利,网友:看了你的福利我想摔手机
  20. 董明珠再砸150亿,欲建立自主创新智能制造产业基地

热门文章

  1. 使用低通滤波器去除基线漂移(MATLAB代码)
  2. 工作四年,分享15个对Java 程序员有用的库
  3. 奥维地图怎么标注文字_如何在奥维地图上准确地告诉别人“我在哪?”
  4. git 分支操作总结
  5. 洛谷:P1460 [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins(DFS)
  6. Base编码(贝斯家族)
  7. 山东大学计算机组成与设计实验七 节拍脉冲发生器时序电路
  8. 开源协议MIT、BSD、Apache
  9. 【Matlab】自定义函数的几种方法
  10. 启贤老师:数字货币投资市场何为盈利 实仓客户心路历程