1. 类加载器

Class类描述的是整个类的信息,在Class类中提供的方法getName()是根据ClassPath配置的路径来进行类加载的。若类加载的路径为文件、网络等时则必须进行类加载这是就需要用到ClassLoader类。

ClassPath:加载类的路径。

(1)ClassLoad:

类加载器用来加载 Java类到Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成Java字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。

观察类加载器的存在性:


  1. //自定义类,也在ClassPath路径下
  2. class Message{}
  3. public class Test2{
  4. public static void main(String[] args) throws Exception {
  5. Class<?> class1 = Class.forName("reflect.Message");
  6. System.out.println(class1.getClassLoader());
  7. System.out.println(class1.getClassLoader().getParent());
  8. System.out.println(class1.getClassLoader().getParent().getParent());
  9. }
  10. }

通过上述程序结果我们可以看到两类类加载器:AppClassLoader、ExtClassLoad;实则jdk默认提供如下几种类加载器:

A. BootStrap:

也称为启动类加载器或核心类加载器。由C++实现,是JVM虚拟机的一部分。

除BootStrap外其他类加载器是由Java语言实现,独立于JVM并且继承与iava.lang.ClassLoader。

主要负责加载JAVA_HOME/lib(典例:rt.jar)

bootStrap类加载器不能直接被程序使用。

B. ExtClassLoader:

扩展类加载器,主要加载JAVA_HOME/lib/ext

有Java语言实现可以被Java程序直接使用。

C. AppClassLoader:

应用程序类加载器,主要负责用户类路径(ClassPath)配置下的类库。若用户为自定义类加载器则默认使用AppClassLoader。

以上三种类加载器加载的代码都必须要求在CLASSPATH中加载。

类加载器带来的好处:

可以通过动态的路径进行类的加载操作。

(1)自定义类加载器

用户决定类从哪里加载。

ClassLoad类中提供进行类加载的方法:

protected Class<?> loadClass(String name, boolean resolve)

比较两个类相等的前提:

必须是由同一个类加载器加载的前提下才有意义。否则,即使两个类来源于同一个Class 文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那么这两个类注定相等。

2. 类加载器的双亲委派模型

(1)双亲委派模型定义

四中类加载器的层次关系就称为双亲委派模型。

(2)双亲委派模型中除了BootStrap外,其他类加载器都有自己的父类加载器。

(3)工作流程:

当一个类加载器收到加载类请求时,先不自己处理而是把加载请求委托给父加载器处理,只有当所有父加载器无法加载此类时子类才尝试自己加载。

好处:保证Java程序的稳定执行。

(4)双亲委派模型从jdk1.2之后引入,但它不强制约束,甚至可以破坏双亲委派模型来进行类加载(典型:OSGI技术:Java模块化技术)。

(5)双亲委派模型可保证Java程序的稳定执行(如:自定义java。Lang包下的Object类,类加载器始终都不会对自定义的进行加载)。

ClassLoad类加载器与双亲委派模型的更多相关文章

  1. 【深入理解JVM】类加载器与双亲委派模型

    原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...

  2. Java自定义类加载器与双亲委派模型

    其实,双亲委派模型并不复杂.自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后copy一下就能用.但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制,这样显然不行.可是自定义类 ...

  3. 【深入理解JVM】:类加载器与双亲委派模型

    类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...

  4. 深入理解java虚拟机(九)类加载器以及双亲委派模型

    虚拟机把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类加载器”. 类与类加载器 任 ...

  5. JVM类加载器以及双亲委派模型

    从java开发人员的角度来看,类加载器可以分为3种: 1.启动类加载器(Bootstrap ClassLoader),负责将存放在<JAVA_HOME>\lib目录中,或者被-Xbootc ...

  6. 【深入理解JVM】类加载器与双亲委派模型 (转)

    出处: [深入理解JVM]类加载器与双亲委派模型 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过 ...

  7. Tomcat 类加载器打破双亲委派模型

    我们分为4个部分来探讨: 1. 什么是类加载机制? 2. 什么是双亲委任模型? 3. 如何破坏双亲委任模型? 4. Tomcat 的类加载器是怎么设计的? 我想,在研究tomcat 类加载之前,我们复 ...

  8. 深入理解JVM(③)虚拟机的类加载器(双亲委派模型)

    前言 先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为"类加载器(Class Loader)". 类与类加载器 类加载 ...

  9. 类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型

    一.类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 "字节码 Byte Code" 这种程序存储格式,这构成了 Java 平台无关性的基石.甚至现在平台无关性也开始演变出 ...

随机推荐

  1. for循环中创建线程执行问题

    先执行以一个简单的示例: static void Main(string[] args) { List<int> taskConsumes = new List<int>() ...

  2. 【JavaScript】JS的坚实基础

    前言 ​ 考虑到在后面的开发中,需要大量的使用js语言去进行开发,所以准备重新规整一下javascript的知识点,专门开了一个js的专栏,用来复习一下js语言.万事开头难,要是后面写的有问题的,欢迎 ...

  3. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  4. Go语言并发模型 G源码分析

    Go 的线程实现模型,有三个核心的元素 M.P.G,它们共同支撑起了这个线程模型的框架.其中,G 是 goroutine 的缩写,通常称为 "协程".关于协程.线程和进程三者的异同 ...

  5. Python使用ConfigParser模块读取配置文件(config.ini)以及写入配置文件

    前言 使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是configParser.configPars ...

  6. 在vs2017和vs2019下发布应用之Windows程序打包-附图标修改和默认安装路径定义全教程

    title: 在vs2017和vs2019下发布应用之Windows程序打包-附图标修改和默认安装路径定义全教程 date: 2020-04-25 sidebarDepth: 2 tags: wind ...

  7. Go语言核心36讲(Go语言实战与应用五)--学习笔记

    27 | 条件变量sync.Cond (上) 前导内容:条件变量与互斥锁 我们常常会把条件变量这个同步工具拿来与互斥锁一起讨论.实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用. 条件 ...

  8. request模块做post请求时,body为json格式,并且带有中文,如何请求

    后台接口只能解析json,并且一定要是中文才能解析出来,如果是unicode编码的中文则会报错 看requests的源码.以下为解决方法: #将requests库中的models.py文件中的第461 ...

  9. 菜鸡的Java笔记 数字操作类

    数字操作类        Math 类的使用        Random 类的使用        BigInteger 和 BigDecimal 类的使用                Math 是一 ...

  10. 印象最深的一个bug:sessionStorage缓存在移动端失效

    无bug,不程序:作为程序员的我,不是修bug就是在写bug的路上. 移动端sessionStorage缓存失效是我"印象最深的一个bug"之一,为啥呢,因为这个问题导致我加班到很 ...