Java类装载机制要义
所有类都由类装载器载入,载入内存中的类对应一个 java.lang.Class 实例。
已被加载的类由该类的类加载器实例与该类的全路径名的组合标识。设有 packagename.A Class ,分别被类加载器 CL1 和 CL2
加载,则系统中有两个不同的 java.lang.Class 实例 。存在一个 Bootstrap Loader (以下简称为 BL ),由 C++ 写成,负责在虚拟机启动后一次性加载 Java 基础类库中的所有类。其他的类装载器由 Java 写成,都是 java.lang.ClassLoader 的子类。
除 BL 之外的所有类装载器都有一个 parent 属性,指向其父装载器。查阅 java.lang.ClassLoader
的源码,不难发现类装载器的委托装载方式。
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;
}
对于给定的类名,首先检查自己是否已加载过该类。如果没有,则首先通过父装载器加载(如果 parent==null ,则直接通过 BL 来加载,相当于 BL
是其父装载器)。如果父装载器也无法装载,才真正调用自己的 findClass() 方法来装载。
Java 基础类在 Java 虚拟机启动后由 BL 一次性载入。构成 Java 应用程序的其它类在程序运行过程中由不同类装载器按需通过
loadClass() 方法装载。
Java 程序启动过程中的类装载器
当执行“ java XXX.class ”时, java.exe 首先找到 JRE ( Java Runtime Environment ),接着找到位于
JRE 之中的 jvm.dll ,最后载入 jvm.dll 并启动虚拟机。
虚拟机一启动,先做一些初始化动作,如获取系统参数等,然后产生 BL 。 BL 加载 Java 基础类,这些类都存放在 JRE 中的 lib 目录下,可由
System.getProperty(“sun.boot.class.path”) 列出,如:
C:\Program Files\Java\jre1.5.0_09\lib\rt.jar;
C:\Program Files\Java\jre1.5.0_09\lib\i18n.jar;
C:\Program Files\Java\jre1.5.0_09\lib\sunrsasign.jar;
C:\Program Files\Java\jre1.5.0_09\lib\jsse.jar;
C:\Program Files\Java\jre1.5.0_09\lib\jce.jar;
C:\Program Files\Java\jre1.5.0_09\lib\charsets.jar;
C:\Program Files\Java\jre1.5.0_09\classes
BL 然后创建 sun.misc.Launcher$ExtClassLoader ( ExtClassLoader 是定义于
sun.misc.Launcher 之内的内部类,继承自 java.lang.URLClassLoader )的实例(以下简称 EL )和
sun.misc.Launcher$AppClassLoader ( AppClassLoader 是定义于 sun.misc.Launcher
之内的内部类,继承自 URLClassLoader )的实例(以下简称 AL ),并将 EL 的 parent 属性设置为 null , AL 的 parent
属性设置为 EL 。
EL 在程序运行过程中按需加载保存在 JRE 的“ \lib\ext ”目录下的类。该目录可由
System.getProperty(“java.ext.dirs”) 读出,如
C:\Program Files\Java\jre1.5.0_09\lib\ext
AL 在程序运行过程中按需加载的类搜索路径则是从系统参数 java.class.path 取出的字符串。 java.class.path 是由我们在执行
java.exe 时,利用 -cp 或 -classpath 或 CLASSPATH 环境变量所决定。我们应用程序用到的非 JRE 提供类的搜索路径一般都配置在
java.class.path 中.
什么时候装载类,由什么类装载器装载
1. Java 基础类由 BL 在虚拟机启动时一次性载入。
2. 包含 main() 的入口类由 AL 的 loadClass() 方法载入。
3. 由 new 关键字创建一个类的实例。该类由运行时刻包含该 new 语句的类实例的类装载器(
ClassLoader.getCallerClassLoader() )的 loadClass() 方法载入。
4. 调用 Class.forName() 方法。完整的 forName() 函数版本有一个 ClassLoader
参数,用于指定用什么类装载器来装载指定类。
public static Class forName(String name, boolean initialize,
ClassLoader loader) throws ClassNotFoundException
对于 public static Class forName(String className) 版本,是由运行时刻包含该语句的类实例的类装载器(
ClassLoader.getCallerClassLoader() )的 loadClass() 方法载入。
5. 调用某个 ClassLoader 实例的 loadClass() 方法。通过该 ClassLoader 实例的 loadClass()
方法载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。
6 .装载一个类时,首先要装载该类的基类及其接口。
分享到:
相关推荐
Java虚拟机类装载机制是Java运行环境中的核心组成部分,它负责将类的字节码从磁盘、网络等不同来源加载到JVM中,并进行一系列处理以使类能够被正确地使用。类装载机制的目的是为了实现代码的动态加载和运行时的灵活...
java类装载介绍,介绍了java装载类的先后顺序
Java虚拟机(JVM)是Java程序运行的核心,它的类装载机制是理解Java应用程序如何启动、运行和管理的关键。本文将深入探讨Java虚拟机的类装载机制,包括其原理、工作流程以及在实际开发中的应用。 类装载机制是Java...
Java虚拟机类装载机制是Java运行环境的核心技术之一,它允许程序在运行时动态加载和使用类,极大地增强了软件的灵活性和可扩展性。本文主要探讨了类装载的原理、实现方式及其在实际应用中的作用。 首先,类装载的...
Java类装载器机制是Java语言灵活性的关键组成部分,尤其在J2EE应用服务器中扮演着重要角色。理解这一机制有助于开发者更好地部署和管理应用程序,解决可能出现的部署问题。 Java类装载器是Java虚拟机(JVM)的一...
所有JVM都内置了一个特殊的类装载器——根装载器(Bootstrap ClassLoader),它负责装载Java核心类库。当需要装载非设计时已知的类时,则需要使用用户自定义的类装载器。 #### 实例演示 以下是一个简单的示例,...
类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念
Java虚拟机类装载 Java虚拟机(JVM)的类装载是指将包含在类文件中的字节码装载到JVM中...了解了JVM中的类装载机制和ClassLoader的工作原理,可以更好地理解Java虚拟机的工作机制,并更好地使用Java语言开发应用程序。
Java 类装载过程是Java虚拟机(JVM)运行的核心机制之一,主要涉及到类从加载到初始化的完整生命周期。这一过程确保了程序的正确运行,并在安全性方面起到关键作用。以下是详细的解释: 1)装载(Loading): 在这...
"Java卡的可信代码装载机制设计" 本文将详细介绍Java卡的可信代码装载机制设计,以满足可信计算平台(TCP)需求。该设计基于Java卡技术,采用代码签名技术作为主要手段,以卡内的安全域(Security Domain)作为各个...
在Java编程语言中,类装载器(ClassLoader)和命名空间是理解Java运行时环境的重要概念。它们共同确保了程序的正确性和安全性。类装载器负责将类文件加载到Java虚拟机(JVM)中,而命名空间则帮助组织和管理这些类,...
Java虚拟机(JVM)的类装载机制是Java运行时环境的核心组成部分,它负责将类文件中的字节码加载到JVM中,使类成为JVM的一部分。类装载过程不仅涉及基本的类查找和导入,还包含了链接、验证、准备、解析和初始化等多...
装载问题-分支限界算法-java实现 装载问题 装载问题是一种经典的组合优化问题,目的是在有限的容量内装载尽可能多的物品,以达到最大化总重量或总价值。装载问题有多种变种,包括0/1背包问题、分支限界问题、动态...
类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。
本篇文章将深入探讨Java类文件的动态装载机制,并结合源码分析其工作原理。 Java类的装载过程主要由类加载器(ClassLoader)来完成,这是一个关键组件,它负责查找、加载和初始化类。Java类加载器分为系统类加载器...
### Java深度历险(2)--深入类装载器 #### 前言 在现代软件开发领域,特别是使用Java这样的高级编程语言时,“动态性”是一个非常重要的概念。它指的是程序能够在运行时根据需要加载、卸载或替换部分代码的能力。这...
Java 类的动态装载机制是Java 虚拟机的一项核心技术,可以在运行时刻动态地加载或替换系统的 某些功能模块,而不影响系统其它功能模块的正常运行。介绍了Java 虚拟机中类的动态装载机制的原理、实现 及应用,分析了...
《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是...总之,深入理解JVM的类装载器原理,不仅有助于我们更好地理解和调试Java程序,也有助于我们在实际开发中实现更加高效和灵活的类管理机制。