JVM中的双亲委派机制

四种类加载器

  • 启动类加载器(Bootstrap Class Loader ):加载$JAVA_HOME/jre/lib目录下的jar包
  • 拓展类加载器(Extension Class Loader):加载$JAVA_HOME/jre/lib/ext目录下的jar包
  • 应用程序类加载器(Application Class Loader):加载ClassPath目录下的jar包
  • 自定义类加载器(User Class Loader):加载自定义指定目录下的jar包

双亲委派机制

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

图片

代码示例

当获取Bootstrap class loader的时候,输出了null,说明开发者无法通过引用操作启动类加载器

图片

双亲委派机制的作用

每个加载器都只需要固定的加载自己管理范围内的类,这样的好处就是保证了Java体系的稳定,不然的话你自己定义一个String类的话,这样系统中就会有两个String类,如果没有双亲委派机制的话,系统就不知道到底该加载哪一个,这样系统就变得一片混乱了。

破坏双亲委派机制

双亲委派机制是Java设计者推荐给开发者们的类加载实现方式,并不是一个强制性约束的模型,所以也可以人为的破坏这个机制。

  • 源码

源码在java.lang.ClassLoader有兴趣的可以去看下

图片

可以看到,就这短短的几行代码,就实现了听起来很高大上的双亲委派机制,所以破坏双亲委派机制的话,就直接重写loadClass方法就可以了。