类加载器以及双亲委派模式
类加载器以及双亲委派模式
类加载器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应用
类加载器以及双亲委派模式相关推荐
- java类加载器、双亲委派、沙箱安全机制全都让你整明白(三万字,收藏慢慢啃)
目录 一.概述 1.类加载的分类 2.类加载器的必要性 3.命名空间 4.类加载机制的基本特征 二.类加载器的分类 1.引导类加载器 2.扩展类加载器 3.系统类加载器 4.用户自定义类加载器 三.测 ...
- 深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
转载自 深入JVM系列(三)之类加载.类加载器.双亲委派机制与常见问题 一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用 ...
- jvm:类加载器与双亲委派模型
两个类相等需要类本身相等,并且使用同一个类加载器进行加载.这是因为每一个类加载器都拥有一个独立的类名称空间. 这里的相等,包括类的 Class 对象的 equals() 方法.isAssignable ...
- 类加载器、双亲委派模型
目录 1.简介 2.类和类加载器 3.双亲委派模型 3.1 启动类加载器: 3.2 扩展类加载器 3.3应用程序类加载器 3.4 类加载器的双亲委派模型(Parents Delegation Mod ...
- Android插件化开发基础之Java类加载器与双亲委派模型
类加载器 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需 ...
- 【深入理解JVM】:类加载器与双亲委派模型
转载自 [深入理解JVM]:类加载器与双亲委派模型 类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段" ...
- java 类加载 双亲委派_Java类加载器和双亲委派机制
前言 之前详细介绍了Java类的整个加载过程(类加载机制详解).虽然,篇幅较长,但是也不要被内容吓到了,其实每个阶段都可以用一句话来概括. 1)加载:查找并加载类的二进制字节流数据. 2)验证:保证被 ...
- JVM—类加载器和双亲委派模型
关注微信公众号:CodingTechWork,一起工作学习总结. 文章目录 引言 类加载器 类与类加载器关系 类加载器分类 启动类加载器 扩展类加载器 应用程序类加载器 双亲委派模型 介绍 工作流程 ...
- 【java】 Java 类加载器 破坏双亲委派
1.概述 深入探讨 Java 类加载器 Java双亲委派模型:为什么要双亲委派?如何打破它?破在哪里? Java中的双亲委派机制以及如何打破
最新文章
- [Firebug]用来武装Firebug的十三款Firefox插件
- 反恐精英代码_反恐精英20周年,为什么沙漠2(dust2)地图玩家们一直玩不腻?...
- Codeforces Global Round 14 E. Phoenix and Computers 思维 + dp
- Spring boot 中pom.xml 各个节点详解
- 谈谈Groovy闭包
- linux 系统自动挂起,linux 系统挂起
- DeepStream参数配置之sink
- Check $M2_HOME environment variable and mvn script
- java linux获取本机ip_Java 获取本机IP
- PDF怎么快速统计文档字数?这两种方法很简单
- 《iRedMail邮件服务器搭建详细过程》
- win32_mfc 理论资料 供自己查阅
- 超详细图文保姆级教程:App开发新手入门(一)
- 弘辽科技:胡润研究院发布《2020胡润中国10强电商》榜单,第二名很意外
- oracle授权v$lock,访问V$LOCK视图Oracle 11g出现性能问题
- 春节不打烊,这份安全应急指南请收好!
- OpenStack 云主机的创建
- [agc004e]Salvage Robots
- 如何在微信读书上阅读极客时间专栏?
- 贪心算法之圣诞老人的礼物