类装载器工作机制
类装载器就是寻找类的节码文件并构造出类在JVM 内部表示对象的组件。在Java 中,
类装载器把一个类装入JVM
中,要经过以下步骤:
1. 装载:查找和导入Class 文件;
2. 链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:
a)校验:检查载入Class 文件数据的正确性;
b)准备:给类的静态变量分配存储空间;
c)解析:将符号引用转成直接引用;
3. 初始化:对类的静态变量、静态代码块执行初始化工作。
类装载工作由ClassLoader
及其子类负责,ClassLoader 是一个重要的Java 运行时系统组件,它负责在运行时查找和装入Class 字节码文件。JVM 在运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。其中,根装载器不是ClassLoader 的子类,它使用C++编写,因此我们在Java 中看不到它,根装载器负责装载JRE 的核心类库,如JRE 目标下的rt.jar、charsets.jar 等。ExtClassLoader 和AppClassLoader 都是ClassLoader 的子类。其中ExtClassLoader 负责装载JRE 扩展目录ext 中的JAR 类包;AppClassLoader 负责装载Classpath 路径下的类包。这三个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader 的父装载器,ExtClassLoader 是AppClassLoader 的父装载器。默认情况下,使用AppClassLoader 装载应用程序的类,我们可以做一个实验:
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println("current loader:"+loader);
System.out.println("parent loader:"+loader.getParent());
System.out.println("grandparent loader:"+loader.getParent(). getParent());
}
}
运行以上代码,在控制台上将打出以下信息:
current
loader:sun.misc.Launcher$AppClassLoader@131f71a
parent
loader:sun.misc.Launcher$ExtClassLoader@15601ea
//①根装载器在Java中访问不到,所以返回null
grandparent loader:null
通过以上的输出信息,我们知道当前的ClassLoader 是AppClassLoader,父ClassLoader
是ExtClassLoader,祖父ClassLoader 是根类装载器,因为在Java 中无法获得它的句柄,
所以仅返回null。
JVM
装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader 装载
一个类的时,除非显式地使用另一个ClassLoader,该类所依赖及引用的类也由这个
ClassLoader 载入;“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下
才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,试想如果有人编写
了一个恶意的基础类(如java.lang.String)并装载到JVM 中将会引起多么可怕的后果。但
是由于有了“全盘负责委托机制”,java.lang.String 永远是由根装载器来装载的,这样就避
免了上述事件的发生。
ClassLoader
重要方法
在Java 中,ClassLoader
是一个抽象类,位于java.lang 包中。下面对该类的一些重要
接口方法进行介绍:
Class loadClass(String name)
name
参数指定类装载器需要装载类的名字,必须使用全限定类名,如com.baobaotao.
beans.Car。该方法有一个重载方法loadClass(String
name ,boolean resolve),resolve 参数告
诉类装载器是否需要解析该类。在初始化类之前,应考虑进行类解析的工作,但并不是所
有的类都需要解析,如果JVM 只需要知道该类是否存在或找出该类的超类,那么就不需
要进行解析。
Class defineClass(String
name, byte[] b, int off, int len)
将类文件的字节数组转换成JVM 内部的java.lang.Class 对象。字节数组可以从本地文
件系统、远程网络获取。name 为字节数组对应的全限定类名。
Class findSystemClass(String name)
从本地文件系统载入Class 文件,如果本地文件系统不存在该Class 文件,将抛出
ClassNotFoundException 异常。该方法是JVM 默认使用的装载机制。
Class
findLoadedClass(String name)
调用该方法来查看ClassLoader 是否已装入某个类。如果已装入,那么返回
java.lang.Class 对象,否则返回null。如果强行装载已存在的类,将会抛出链接错误。
ClassLoader getParent()
获取类装载器的父装载器,除根装载器外,所有的类装载器都有且仅有一个父装载器,
ExtClassLoader 的父装载器是根装载器,因为根装载器非Java 编写,所以无法获得,将返
回null。
除JVM 默认的三个ClassLoader
以外,可以编写自己的第三方类装载器,以实现一些
特殊的需求。类文件被装载并解析后,在JVM 内将拥有一个对应的java.lang.Class 类描述
对象,该类的实例都拥有指向这个类描述对象的引用,而类描述对象又拥有指向关联
ClassLoader 的引用,
每一个类在JVM 中都拥有一个对应的java.lang.Class
对象,它提供了类结构信息的描
述。数组、枚举、注解以及基本Java 类型(如int、double 等),甚至void 都拥有对应的
Class 对象。Class 没有public 的构造方法。Class 对象是在装载类时由JVM 通过调用类装
载器中的defineClass()方法自动构造的。
分享到:
相关推荐
理解类装载器的工作原理对于优化Java应用性能和实现动态加载类至关重要。 装载过程包括三个主要步骤:装载、链接和初始化。装载阶段,类装载器依据指定的全限定类名(如`java.lang.Object`)去寻找对应的二进制数据...
此方法不仅加深了我们对于Java类装载机制的理解,同时也提供了一种实用的数据保护手段。 #### 位移加密算法 位移加密算法是一种简单但有效的加密方式,主要通过改变字节的二进制位位置来实现加密和解密功能。 ####...
Java类装载器机制是Java语言灵活性的关键组成部分,尤其在J2EE应用服务器中扮演着重要角色。理解这一机制有助于开发者更好地部署和管理应用程序,解决可能出现的部署问题。 Java类装载器是Java虚拟机(JVM)的一...
5. **装载器的运作机制**:如何在内存中安排程序,以及如何处理程序的入口点和初始化。 6. **动态链接**:解释了DLL(动态链接库)或SO(共享对象)的概念,以及它们如何在运行时被加载和使用。 7. **调试信息**:...
通过实践编写自己的类装载器,不仅可以加深对JVM内部工作原理的理解,还能锻炼对Java反射、字节码操作、类加载机制的掌握。这是一个提升Java技术水平的重要步骤,也是成为一名资深Java开发者必备的技能之一。
Java虚拟机类装载机制是Java运行环境中的核心组成部分,它负责将类的字节码从磁盘、网络等不同来源加载到JVM中,并进行一系列处理以使类能够被正确地使用。类装载机制的目的是为了实现代码的动态加载和运行时的灵活...
本文将深入探讨Java虚拟机的类装载机制,包括其原理、工作流程以及在实际开发中的应用。 类装载机制是Java虚拟机在运行时动态加载和初始化类的过程。这一过程涉及到了四个主要角色:类装载器(ClassLoader)、类的...
### Java虚拟机类装载的原理及实现 #### 引言 Java虚拟机(JVM)作为执行Java程序的核心,承担着解释执行字节码的...通过深入了解类装载的过程和机制,开发者可以更好地利用这一特性来优化和增强Java应用程序的功能。
Android作为Java语言的一个分支,同样继承了JVM的这一机制,并通过特定的类装载器来加载APK中的类。 ### PathClassLoader PathClassLoader是Android提供的用于加载已知路径下APK文件的类装载器。它通常用于加载已...
Java虚拟机类装载机制是Java运行环境的核心技术之一,它允许程序在运行时动态加载和使用类,极大地增强了软件的灵活性和可扩展性。本文主要探讨了类装载的原理、实现方式及其在实际应用中的作用。 首先,类装载的...
这种机制确保了类的唯一性,即相同的类只会被同一个类装载器加载一次。同时,这也使得类之间的隔离变得可能,即使两个类具有相同的全限定名,只要它们由不同的类装载器加载,就可以视为不同的类。 #### WebSphere类...
Java虚拟机类装载 Java虚拟机(JVM)的类装载是指将包含在类文件中的字节码装载到JVM中...了解了JVM中的类装载机制和ClassLoader的工作原理,可以更好地理解Java虚拟机的工作机制,并更好地使用Java语言开发应用程序。
Java虚拟机(JVM)的类装载机制是Java运行时环境的核心组成部分,它负责将类文件中的字节码加载到JVM中,使类成为JVM的一部分。类装载过程不仅涉及基本的类查找和导入,还包含了链接、验证、准备、解析和初始化等多...
本篇文章将深入探讨Java类文件的动态装载机制,并结合源码分析其工作原理。 Java类的装载过程主要由类加载器(ClassLoader)来完成,这是一个关键组件,它负责查找、加载和初始化类。Java类加载器分为系统类加载器...
Java 类装载过程是Java虚拟机(JVM)运行的核心机制之一,主要涉及到类从加载到初始化的完整生命周期。这一过程确保了程序的正确运行,并在安全性方面起到关键作用。以下是详细的解释: 1)装载(Loading): 在这...
类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。