类加载器以及双亲委派模式

类加载器ClassLoader

类的加载流程的"加载"阶段是由类加载器完成的。

JVM什么时候加载.class文件

当执行new操作时候

当执行Class.forName(“包路径 + 类名”)

分类

启动类加载器(Bootstrap ClassLoader)

C++编写;

为ExtClassLoader的父类,但是通过ExtClassLoader的getParent()获取到的是null;

主要加载:E:\Java\jdk1.6\jre\lib\*.jar(最重要的就是:rt.jar);

扩展类加载器(Extendsion ClassLoader)

java编写,位于sun.misc包下,该包在你导入源代码的时候是没有的,需要重新去下;

主要加载:E:\Java\jdk1.6\jre\lib\ext\*.jar(eg.dnsns.jar);

应用类加载器(Application ClassLoader)

java编写,位于sun.misc包下;系统默认的类加载器;

主要加载:负责加载用户类路径(CLASSPATH)下的类

自定义加载器

自己编写的类加载器,需要继承ClassLoader类或URLClassLoader,并至少重写其中的findClass(String name)方法,若想打破双亲委托机制,需要重写loadClass方法;

主要加载:自己指定路径的class文件。

Java类装载机制:全盘负责双亲委托机制

全盘负责:

当一个ClassLoder装载一个类时,该类所依赖及引用的类也由这个ClassLoder载入。

假设ClassLoaderA要加载class B,但是B引用了class C,那么ClassLoaderA先要加载C,再加载B。

双亲委派模式

含义:

类加载器收到类加载的请求时,会将该请求委托派给父类加载器去完成,蹭蹭递进,所有的请求被传递值顶层的启动类加载器中。只有父类加载器无法加载时,才会交给自类加载器去尝试加载。

流程

类的加载过程只有向上的双亲委托,没有向下的查询和加载。

假设A加载成功了,那么该类就会缓存在当前的类加载器实例对象C中,key是(A,C)(其中A是类的全类名,C是加载A的类加载器对象实例),value是对应的java.lang.Class对象

进行缓存的目的是为了同一个类不被加载两次

为什么要使用这种双亲委托模式呢?

假设自己编写了一个java.lang.Object类,编译后置于类路径下,此时在系统中就有两个Object类,一个是rt.jar的,一个是类路径下的,在类加载的过程中,当要按照全类名去加载Object类时,根据双亲委托,boot会加载rt.jar下的Object类,这是方法结束,即类路径下的Object类就没有加载了。这样保证了系统中类不混乱。

类的装载方式

由 new 关键字创建一个类的实例

程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。如:Dog dog = new Dog();

静态加载,使用的是当前类的加载器

通过反射加载类型,并创建对象实例

如:Class clazz = Class.forName(“Dog”); Object dog =clazz.newInstance();

动态加载,使用的是当前类的加载器

调用某个 ClassLoader 实例的 loadClass() 方法

如:Class clazz = cl.loadClass(“Dog”); Object dog =clazz.newInstance();

动态加载,使用的是用户自定义的类加载器对象。

Class

static Class<?>  :  Class.forName("com.wang.HelloWorld")

静态方法。

根据传入的类的全限定名,返回一个Class对象。

在将Class文件加载到内存的同时,会执行类的初始化,即HelloWorld的static{} 以及静态变量初始化.

 ClassLoader  :   getClassLoader()

返回该类的类加载器。

Bootstrap Loader是用C++语言写的,故java程序代码打印输出为null。

ClassLoader源码分析

c.loadClass("com.wang.HelloWorld")

非静态方法。

根据传入的类的全限定名,返回一个Class对象。

将Class文件加载到内存时,并不会执行类的初始化,在new时执行初始化。

findLoadedClass(name):

获取已经缓存的Class对象,不存在则返回null;

findBootstrapClassOrNull(name):

当父加载器为BootStrap ClassLoader时,查找jdk1.6\jre\lib\*.jar下是否存在Class对象

findClass(name):

自定义类加载器时需重写该方法。1.通过输入流读取Class文件为字符数组;2.引用defineClass方法,将二进制字节流转换为了java.lang.Class对象。

ClassNotFoundException

自定义类加载器的实现

目的:用于加载特定目录下的Class文件。

实现逻辑:

继承ClassLoader,重写Class<?> findClass(String name)方法(通过输入流读取class文件为字节数组,调用defineClass方法转化为Class<?>的实例)。

调用:

通过调用对应的loadClass(className),来加载对应的类。

注意:注意自定义的类加载器的父类加载器是否是系统默认的类加载器,即双亲委派模型。

使用场景:

核心类库对字节码文件加密,需自定义findClass解密;

资源隔离,如tomcat以及下的多个webApp应用

类加载器以及双亲委派模式相关推荐

  1. java类加载器、双亲委派、沙箱安全机制全都让你整明白(三万字,收藏慢慢啃)

    目录 一.概述 1.类加载的分类 2.类加载器的必要性 3.命名空间 4.类加载机制的基本特征 二.类加载器的分类 1.引导类加载器 2.扩展类加载器 3.系统类加载器 4.用户自定义类加载器 三.测 ...

  2. 深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题

    转载自 深入JVM系列(三)之类加载.类加载器.双亲委派机制与常见问题 一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用 ...

  3. jvm:类加载器与双亲委派模型

    两个类相等需要类本身相等,并且使用同一个类加载器进行加载.这是因为每一个类加载器都拥有一个独立的类名称空间. 这里的相等,包括类的 Class 对象的 equals() 方法.isAssignable ...

  4. 类加载器、双亲委派模型

    目录 1.简介 2.类和类加载器 3.双亲委派模型 3.1 启动类加载器: 3.2 扩展类加载器 3.3应用程序类加载器 3.4  类加载器的双亲委派模型(Parents Delegation Mod ...

  5. Android插件化开发基础之Java类加载器与双亲委派模型

    类加载器 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需 ...

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

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

  7. java 类加载 双亲委派_Java类加载器和双亲委派机制

    前言 之前详细介绍了Java类的整个加载过程(类加载机制详解).虽然,篇幅较长,但是也不要被内容吓到了,其实每个阶段都可以用一句话来概括. 1)加载:查找并加载类的二进制字节流数据. 2)验证:保证被 ...

  8. JVM—类加载器和双亲委派模型

    关注微信公众号:CodingTechWork,一起工作学习总结. 文章目录 引言 类加载器 类与类加载器关系 类加载器分类 启动类加载器 扩展类加载器 应用程序类加载器 双亲委派模型 介绍 工作流程 ...

  9. 【java】 Java 类加载器 破坏双亲委派

    1.概述 深入探讨 Java 类加载器 Java双亲委派模型:为什么要双亲委派?如何打破它?破在哪里? Java中的双亲委派机制以及如何打破

最新文章

  1. [Firebug]用来武装Firebug的十三款Firefox插件
  2. 反恐精英代码_反恐精英20周年,为什么沙漠2(dust2)地图玩家们一直玩不腻?...
  3. Codeforces Global Round 14 E. Phoenix and Computers 思维 + dp
  4. Spring boot 中pom.xml 各个节点详解
  5. 谈谈Groovy闭包
  6. linux 系统自动挂起,linux 系统挂起
  7. DeepStream参数配置之sink
  8. Check $M2_HOME environment variable and mvn script
  9. java linux获取本机ip_Java 获取本机IP
  10. PDF怎么快速统计文档字数?这两种方法很简单
  11. 《iRedMail邮件服务器搭建详细过程》
  12. win32_mfc 理论资料 供自己查阅
  13. 超详细图文保姆级教程:App开发新手入门(一)
  14. 弘辽科技:胡润研究院发布《2020胡润中国10强电商》榜单,第二名很意外
  15. oracle授权v$lock,访问V$LOCK视图Oracle 11g出现性能问题
  16. 春节不打烊,这份安全应急指南请收好!
  17. OpenStack 云主机的创建
  18. [agc004e]Salvage Robots
  19. 如何在微信读书上阅读极客时间专栏?
  20. 贪心算法之圣诞老人的礼物

热门文章

  1. Java中对两个对象进行比较大小
  2. amd RX6800和rtx3070哪个好
  3. 次世代教程——美队盾牌雕刻
  4. 7-15 福到了 c语言,7-7 福到了 (15分)
  5. mx4 pro 刷 原生 android,如期而至:MX4 Pro 迎来首个 Android 5.0 体验固件
  6. 优盘启动盘恢复为普通优盘
  7. L1-084 拯救外星人 C语言
  8. 用Excel表格拆分一行里的内容
  9. 旗下企业永远不会超过七家 马云
  10. 【QQ农场两周年】回想我的农场