什么是ClassLoader
ClassLoader负责将 Java 字节码装载到 JVM 中。ClassLoader本身是一个抽象类,我们用它的子类的实例对象来装载类。通常我们通过类名读入一个class文件来加载一个类。
classloader 层次结构图
java虚拟机内部一般用三个classLoader来完成类的加载工作。
1. Bootstrap ClassLoader (启动类加载器)
----由c++实现。没有parent。启动类加载器负责加载java核心库代码
2. ExtClassLoader (扩展类加载器)
----继承自URLClassLoader,双亲是Bootstrap ClassLoader。负责从java.ext.dirs扩展目录中加载类
3. AppClassLoader (系统类加载器)
----继承自URLClassLoader,双亲是ExtClassLoader。负责从CLASSPATH路径中加载应用程序代码。
除虚拟机自带的一些类装载器外,还有一些用户自定义的类装载器。
ClassLoader装载的委托模式
首先, 每一个自定义类装载器在创建时被指定一个“双亲”parent类装载器。如果在构造方法中未显式指定parent类装载器,系统类装载器就默认被指定为parent类装载器。如果传递null,则意味着指定启动类装载器为parent.
启动类装载器没有parent。
那么,类装载器之间的双亲孩子关系用来做什么呢? 它们构成了一条装载工作的委托链。 装载一个类时,先由自己定义的类装载器请求其parent装载,parent再请求它自己的parent装载,直到顶级的Bootstrap ClassLoader。 若某一级的parent能装载则装载之,否则由它的“下级”自己尝试装载。
ClassLoader.java 中的loadClass方法代码如下:
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
由代码结合前面的层次结构图可知,装载一个类时的优先次序为:
启动类装载器 => 扩展类装载器 => 系统类装载器 => 用户自定义的类加载器
这也以为着首先会在最可信的JAVA核心类库中查找要装载的类,依次再去扩展路径、系统类路径(CLASSPATH)中查找,防止用户不可靠的类覆盖可信的系统类,从而提高安全性。
ClassLoader的命名空间
由不同的类装载器装载的类被虚拟机放入不同的命名空间。可近似理解为虚拟机为每个由类装载器装载的类安排了一个唯一标识,形如:ClassLoaderName.packageName.ClassName. 这意味着:由同一个加载器加载的不同类拥有不同的标识;由不同类加载器加载的同一个类,其标识也不同。
虚拟机为每一个类装载器维护一张列表,列表中是已经被装载的类型的名字。 这个列表可以保证同一个类型不会被同一个装载器装载超过一次。
这里java虚拟机对命名空间的访问做了一些限制,具体有两条:
1. 同一命名空间内的类可直接交互(双向)。不同命名空间的类一般不可交互,除非使用反射等显式指定的交互机制或者符合条件2.
2. 类型可以共享。如果某个类加载器A把类型C委托给双亲委托链中的另一个加载器B,且B完成了实际装载工作,那么C在从A到B的这段双亲委托链的命名空间中共享,即C可以访问这些装载器所装载的其它类(单向的)。 by the way, 这也是我们可以直接在自己代码中使用java 核心库API的原因,因为他们被Bootstrap Loader装载。
Over~
- 大小: 6.7 KB
分享到:
相关推荐
理解Java ClassLoader机制
深入了解Java_ClassLoader,Bytecde.pdf
ClassLoader类加载器讲解,理解JAVA类加载机制
Java默认是有三个ClassLoader,按层次关系从上到下依次是: Bootstrap ClassLoader Ext ClassLoader System ClassLoader Bootstrap ClassLoader是顶层的ClassLoader,它比较特殊,是用C++编写集成在...
关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解
jvm运行的过程中,需要载入类,而类的加载需要类加载器,本文章提供了java的类加载器的工作原理。可以使读者更加理解jvm的运行机制。
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
该电子书详细介绍了java虚拟机类加载机制,对于深入理解jvm工作原理有很好的帮助作用,对于初学java,有一定工作经验的小伙伴来说是一本提高自身java素养,夯实自己java基本技能的“葵花宝典”。
《深入理解java虚拟机》 2、对java“书写一次,到处运行”(Write once, run anywhere)的理解? 一次编译、到处运行”说的是Java语言跨平台的特性,Java的跨平台特性与Java虚拟机的存在密不可分,可在不同的环境中...
面试必考之HashMap源码分析与实现 ,微服务架构之Spring Cloud Eureka 场景...锁、分布式锁、无锁实战全局性IDSpringMvc深入理解源码分析 Nosql Redis Jedis常用命令 JAVA并发编程之多线程并发同步业务场景与解决方案
该文档主要整理了常见的Java基础面试题,包含以下内容: ...32. Class.forName()和ClassLoader.loadClass()的区别 34. 如何防止创建的类名不能java为已有类名,Java加载双亲委派机制 35. 堆和栈的区别
3.对Java虚拟机、JMM、垃圾收集机制、GC算法、JVM常用配置参数、GC参数、classLoader、锁机制、JVM故障分析,jmap,jstack等jdk提供的工具命令,性能监控工具(java visualVM),JVM参数调优有一定了解; 4.熟悉java...
除了Java语言具有的许多安全特性以外,Java对通过网络下载 的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的 同名类、字节代码检查,并提供安全管理机制让Java应用设置安全哨兵。...
理解 Class 类 理解 Java 的类加载机制 学会使用 ClassLoader 进行类加载 理解反射的机制 掌握 Constructor、Method、Field 类的用法 理解并掌握动态代理
其次深入介绍了Java 技术,包括I/O 技术、中文编码问题、Javac 编译原理、class 文件结构解析、ClassLoader 工作机制及JVM 的内存管理等。最后介绍了Java 服务端技术,主要包括Servlet、Session 与Cookie、Tomcat 与...
理解Class 类 理解Java 的类加载机制 学会使用ClassLoader 进行类加载 理解反射的机制 掌握Constructor、Method、Field 类的用法 理解并掌握动态代理
类的动态装载机制是JVM的一...本文介绍了JVM中类装载的原理、实现以及应用,尤其分析了ClassLoader的结构、用途以及如何利用自定义 的ClassLoader装载并执行Java类,希望能使读者对JVM中的类装载有一个比较深入的理解。
除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 ...
怎么理解Condition JAVA细粒度锁实现的几种方式: NIO,IO 注解 [笔记] dagger2: Retrofit和ButterKnife的注解怎么实现 反射 JOOR [ClassLoader==>字节码,apk] Socket==>openfire==>netty 设计模式:都在源码里 更好...