天天看点

使用自定义类加载器打破双亲委派机制实现自定义String类

今天我和大家如何用自定义加载器打破双亲委派机制。

在介绍双亲委派机制前,我先来聊聊Java里面有几种类加载器。

  • 引导类加载器:Bootstrap classloader
  • 扩展类加载器:ExtClassLoader
  • 应用程序类加载器:AppClassLoader
  • 自定义加载器:MyClassLoader(这个名字自定义的)

接下来我们来介绍下什么是双亲委派机制,如下图所示:

使用自定义类加载器打破双亲委派机制实现自定义String类

在这里类加载其实就是个双亲委派机制,比如加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,当所有父加载器在自己的加载路径下都找不到目标类的话就会在自己的类加载路径中查找并且载入目标类。

双亲委派机制的本质就是,加载类时先从父加载器中加载,父加载器没有,再由子加载器中加载。

为什么要设计双亲委派机制?

  • 沙箱安全机制:如果有人想替换系统级别的类:String.java是不会被加载的,这样便可以防止核心API库被随意篡改。
  • 避免类的重复加载:当父加载器已经加载了该类时,就没有必要子加载器再加载一次,保证被加载类的唯一性。

下面我们来通过自定义加载器来打破这种双亲委派机制,并且我们自定义一个String类,让它加载到JVM中运行起来。

使用自定义类加载器打破双亲委派机制实现自定义String类

自定义类加载器

使用自定义类加载器打破双亲委派机制实现自定义String类

自定义String类

使用自定义类加载器打破双亲委派机制实现自定义String类

在目标文文件夹里使用javac 指令将String.java 生成String.class字节码文件。

使用自定义类加载器打破双亲委派机制实现自定义String类

字节码文件已生成

使用自定义类加载器打破双亲委派机制实现自定义String类

运行自定义类加载器

使用自定义类加载器打破双亲委派机制实现自定义String类

运行结果