我们知道 我们在Java中用到的所有的类都是通过类加载器ClassLoader加载到JVM中的,我们还知道  类加载器 也对应着一个类 ,既然这样那么我们会想 那么ClassLoader类是由谁加载的呢?

其实在Java中有许许多多的 类加载器  我们甚至可以写自己的类加载器  。

其中主要三个类加载器(他们是树形关系)是 :

BootStrap :  在java虚拟机启动的时候会利用这个类加载器来加载  JDK安装目录下的  /JRE/LIB/rt.jar    也就是系统默认导入的一些类 例如System类   ,这个类加载器不是类 。只是作为一个java中 类的起源工具

ExpClassLoader    这个类加载器加载JDK安装目录下的  /JRE/LIB/ext   目录中的类     我们只要把 我们的类打包成JAR包 放在这里即可

AppClassLoader   我们在java程序中  classpath对应的类 都有 这个AppClassLoader导入进来

看下面一段代码 :

package me.test;
/**
*   BootStrap  
*   加载  JRE/lib/rt.jar 包中的类   包括我们常用到的类
*  
*   ExtClassLoader
*   专门家在 JDK/JRE/libEXT/*.jar  中的类  只要把我们的类放在这里 就会被 这个加载器加载 
*
*   AppClassLoader  
*   加载ClassPath指定的所有jar和目录
*
* **/
public class Test1
{  
public static void main(String []args)
{
   
  System.out.println(Test1.class.getClassLoader().getClass().getName() );    //获取主类的类加载器

System.out.println(System.class.getClassLoader());   //BootStrap    获取System类的类加载器  因为加载器是 BootStrap所以返回null  以为内他不是一个类
  ClassLoader l=Test1.class.getClassLoader() ;  //获取Test1的类加载器
  while(l!=null)   //循环出 ClassLoader树
  {
   System.out.println(l.getClass().getName());  
   l=l.getParent();
  }
 
  System.out.println(l);
 
}

}

ClassLoader的委托模型

比如说我们在加载一个类的时候   AppClassLoader 他先让  BootStrap来加载类  如果 BootStrap已经加载了 那么就返回  。如果找不到这个类那么  BootStrap就传递给ExtClassLoader  来查找 ,和BootStrap一样 如果找到就加载 如果找不到 久继续传递给 AppClassLoader 来加载 如果 AppClassLoader还找不到的话 那么

AppClassLoader 就会跑出  ClassNotFoundException 异常  。。

我们为什么不利用 AppClassLoader 下级的加载器呢?  因为AppClassLoader下级可能有多个 类加载器 多个类加载器 相互独立 ,如果加载类 那么就会导致内存中出现

多份字节码  ,造成不必要的的内存浪费 。。这就是类加载器的委托模型

转载于:https://www.cnblogs.com/yuedongwei/archive/2012/02/08/4145519.html

Java类加载器 以及类加载器的委托模型相关推荐

  1. Java类加载器(一)——类加载器层次与模型

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  2. java类加载器_类加载器ClassLoader

    上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是 ...

  3. Java虚拟机10:类加载器

    类与类加载器 虚拟机设计团队把类加载阶段张的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...

  4. Tomcat类加载器为何违背双亲委派模型

    本文来说下Tomcat类加载器为何违背双亲委派模型 文章目录 什么是类加载机制 什么是双亲委派模型 如何破坏双亲委任模型 Tomcat的类加载器是怎么设计的 本文小结 什么是类加载机制 代码编译的结果 ...

  5. java赋值语句_深度分析:面试阿里,字节99%会被问到Java类加载机制和类加载器...

    1. 类加载机制 所谓类加载机制就是JVM虚拟机把Class文件加载到内存,并对数据进行校验,转换解析和初始化,形成虚拟机可以直接使用的Jav类型,即Java.lang.Class. 2. 类加载的过 ...

  6. 面试干货4——你对Java类加载器(自定义类加载器)有了解吗?

    类加载器 推荐:在准备面试的同学可以看看这个系列 一.类加载器的作用 二.Java虚拟机类加载器结构 1. 引导类(启动类)加载器 2. 扩展类加载器 3. 系统类加载器 三.类加载器的加载机制 1. ...

  7. java引导类加载器_Java类加载器层次结构(一)

    类加载器有一种父/子关系.除了引导类加载器外,每个类加载器都有一个父类加载器.本章通过分析ClassLoader的源码来展示java类加载器的层次结构. 根据规定,类加载器会为它的父类加载器提供一个机 ...

  8. Java类加载器(类加载的流程、三大类加载器BootstrapClassLoader、ExtClassLoader、AppClassLoader)

    一.三大类加载介绍 1.1.BootstrapClassLoader BootstrapClassLoader是顶级加载器,默认加载的是%JAVA_HOME%中lib下的jar包和class类文件,他 ...

  9. 深入理解Java虚拟机二(类加载器和类的加载过程)

    类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于它是否可以运行,则由Ex ...

最新文章

  1. 谈谈 Docker 网络
  2. 【随笔】深度学习的数据增强还分在线和离线?
  3. Spring JpaRepository示例(内存中)
  4. CCF-CSP 最大的矩形
  5. Kotlin协程入门初级篇
  6. 机器学习基础算法16- 决策树与随机森林-理论部分
  7. PHP - Redis实现入队出队
  8. Android10手机无法拉起微信小程序解决方案
  9. java中怎么做缓存_Java实现一个简单的缓存方法
  10. 基于springBoot的薪资管理系统
  11. 基于91助手实现80/54坐标转换到2000大地坐标的七参数计算
  12. 局域网怎么添加新的计算机用户,如何添加局域网
  13. LIN雨量传感器:吉利雨量感应器拆解 MLX75308开发与应用
  14. 【京东】商品评价数据采集+买家评论数据+卖家评论数据采集+行业数据分析+行业数据质检分析
  15. 怎么修改扫描PDF?扫描件PDF修改编辑教程
  16. android 页面边框设置
  17. zblog插件-zblog搜狗推送插件
  18. java和区块链哪个难_java 区块链中设计合理的难度系数
  19. Codeup——575 | 问题 H: 部分A+B (15)
  20. 脑机接口(1):运动想象(MI)原理、算法、问题和发展趋势

热门文章

  1. python_环境测试
  2. 计算机网络自上而下影印版_《计算机网络(影印版)》 影印 【正版电子纸书阅读_PDF下载】- 书问...
  3. detectron2训练自己的数据集_TensorFlow2学习十五、使用VGG16模型训练自己的数据集...
  4. 需求获取安排计划书_若想成功融资,商业计划书必须秀色可餐:餐饮业商业计划书模板...
  5. python线程wait_python基础线程-管理并发线程
  6. 计算机专业审核作业指导书,专业审核作业指导书
  7. STM8单片机低功耗---停机(Halt)模式实现
  8. Tensorflow GAN对抗生成网络实战
  9. mac下mysql忘记root密码的解决办法
  10. 机器学习解决问题思路 — 词嵌入矩阵E对于NLP问题的重要性