类加载器的双亲委派机制

​ 除了根类加载器之外,其他的类加载器都需要有自己的父加载器。从JDK1.2开始,类的加载过程采用双亲委派机制,这种机制能够很好的保护java程序的安全。除了虚拟机自带的根类加载器之外,其余的类加载器都有唯一的父加载器。比如,如果需要classLoader加载一个类时,该classLoader先委托自己的父加载器先去加载这个类,若父加载器能够加载,则由父加载器加载,否则才有classLoader自己加载这个类。即每个类加载器都很懒,加载类时都先让父加载器去尝试加载,一直到根类加载器,加载不到时自己才去加载。真正加载类的加载器我们叫做启动类加载器。注意,双亲委派机制的父子关系并非面向对象程序设计中的继承关系,而是通过使用组合模式来复用父加载器代码,这种机制如下图所示:

public class ClassLoaderDemo1 {public static void main(String[] args) throws Exception{//演示类加载器的父子关系ClassLoader loader = ClassLoaderDemo1.class.getClassLoader();while(loader!=null){System.out.println(loader);loader = loader.getParent();}}
}
运行结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@1b6d3586

使用双亲委派机制的好处:

1、可以避免类的重复加载,当父类加载器已经加载了该类时,就没有必要子ClassLoader再加载一次。

2、考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Object的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Object,而直接返回已加载过的Object.class,这样便可以防止核心API库被随意篡改。

//定义一个类,注意包名
package java.lang;public class MyObject {}
//加载该类
public static void main(String[] args) {Class clazz = MyObject.class;System.out.println(clazz.getClassLoader());
}
//输出结果
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang

因为java.lang包属于核心包,只能由根类加载器进行加载,而根据类加载的双亲委派机制,根类加载器是加载不到这个MyObject类的(自定义的),所以只能由AppClassLoader进行加载,而这又不是允许的,所以会报出“Prohibited package name: java.lang”(禁止的包名)错误。

类加载的双亲委派机制相关推荐

  1. JVM-白话聊一聊JVM类加载和双亲委派机制源码解析

    文章目录 Java 执行代码的大致流程 类加载loadClass的步骤 类加载器和双亲委派机制 sun.misc.Launcher源码解析 Launcher实例化 Launcher 构造函数 双亲委派 ...

  2. 类加载器-双亲委派机制

    上一篇:类加载器-分类 一.概述 除了根类加载器之外,其他的类加载器都需要有自己的父加载器.从JDK1.2开始,类的加载过程采用双亲委派机制,这种机制能够很好的保护java程序的安全.除了虚拟机自带的 ...

  3. java类加载-ClassLoader双亲委派机制

    "类加载体系"及ClassLoader双亲委派机制.java程序中的 .java文件编译完会生成 .class文件,而 .class文件就是通过被称为类加载器的ClassLoade ...

  4. JVM 学习四:类加载之双亲委派机制与沙箱安全机制

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

  5. java 委派关系_一文读懂java类加载之双亲委派机制

    一个编译后的class文件,想要在JVM中运行,就需要先加载到JVM中.java中将类的加载工具抽象为类加载器,而通过加载工具加载类文件的具体方式被称为双亲委派机制. 知识点 类加载器:通过一个类全限 ...

  6. java委派_一文读懂java类加载之双亲委派机制

    作者:程序猿微录 出自:TinyRecord 一个编译后的class文件,想要在JVM中运行,就需要先加载到JVM中.java中将类的加载工具抽象为类加载器,而通过加载工具加载类文件的具体方式被称为双 ...

  7. 关于类加载的双亲委派机制简单总结

    前言 我们知道,一个编译后的class文件,想要在JVM中运行,就需要先加载到JVM中.而做这个工作的老哥就是类加载器.而通过类加载器,加载类文件的具体方式被称为双亲委派机制. 什么是类加载器?有哪些 ...

  8. java中的类加载与双亲委派机制

    类加载是什么 把磁盘中的java文件加载到内存中的过程叫做类加载 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM. 有如下 User 类 package ...

  9. 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制

    转载自 违反ClassLoader双亲委派机制三部曲第二部--Tomcat类加载机制 前言: 本文是基于 ClassLoader双亲委派机制源码分析 了解过正统JDK类加载机制及其实现原理的基础上,进 ...

最新文章

  1. 一看就会的20个“非常有用”的python小技巧,你一定要试试
  2. Android8.0适配那点事(二)
  3. 20个jQuery 图片及多媒体画廊插件
  4. 推荐系统相关科技论文写作建议
  5. java基础—Runtime类使用
  6. UNIX网络编程——基本TCP套接字编程 【转贴】
  7. qmenubar 添加按钮_QMenuBar,QMenu和QAction(QMenuBar, QMenu QAction)
  8. 在一个IPython Notebook单元中显示多个图像?
  9. 外螺纹对照表_紧固件螺纹直径与螺距对照表
  10. 计算机网络课程思政教学目标,计算机学院举行课程思政示范教学活动
  11. 解读德国政府未来可能采用的加密即时通讯框架
  12. 磁盘的扩展卷和压缩卷显示灰色,无法使用
  13. web前端基础联系作业
  14. python 行情数据,拼多多股票:Python获取股票行情数据的一种方法
  15. c++ 内存泄漏(Detected memory leaks)解决
  16. 模版消息智能推送!我们教你发得更快更多更省
  17. Motan服务的启动
  18. mysql入门视频 吾_学习猿地-全网最新版本MySQL8全套视频教程(学完这个课 MySQL 就精通了)...
  19. 科技创业的新规律:先创业、再创意
  20. FreeCAD紧固件自动生成工作台插件推荐:Fasteners workbench

热门文章

  1. html5--3.2 input元素(1)
  2. 有关单点登录的几种方案
  3. JAVA第一个GUI程序---计算器
  4. Javascrip—拷贝对象(13)
  5. GTKmm 学习资料
  6. 疯狂.NET架构通用权限后台管理工具演示版2.0下载
  7. Wi-Fi与LTE走向融合,优势互补携手共赢
  8. SAP CRM 使用Javascript触发SAP Server Event
  9. 关于H3C MSR路由器L2TP隧道协议路由配置的特点
  10. 进行SEPM的灾难恢复时导入数据库后,Symantec Endpoint Protection Manager(SEPM)无法登陆...