Java虚拟机中类装载机制的原理分析与应用研究_李超
Java类加载机制详解

Java类加载机制详解Java类加载机制是Java虚拟机(JVM)运行Java程序时的一个重要环节。
它负责将Java类的二进制数据加载到内存中,并转换为可以被JVM执行的Java类。
了解Java类加载机制对于理解Java程序的运行机制和调优性能都非常重要。
本文将详细解析Java类加载机制的原理和过程。
一、类加载的五个阶段Java类加载过程包括五个阶段,分别是加载、验证、准备、解析和初始化。
1. 加载阶段:在加载阶段,Java虚拟机通过类的全限定名来读取类的二进制数据,并通过类加载器将其加载到内存中。
2. 验证阶段:在验证阶段,Java虚拟机对加载的类进行验证,确保类的格式符合规范,不会破坏虚拟机的稳定性。
3. 准备阶段:在准备阶段,Java虚拟机为类的静态变量分配内存并设置默认初始值,这些变量在方法区中分配。
4. 解析阶段:在解析阶段,Java虚拟机将类的符号引用替换为直接引用,使得虚拟机能够直接确定类、方法、字段的真实地址。
5. 初始化阶段:在初始化阶段,Java虚拟机执行类的初始化方法,并为静态变量赋予正确的初始值,确保类被正确初始化。
二、类加载器Java类加载器负责将类加载到内存中,并按需加载依赖的类。
Java虚拟机内置了三个核心类加载器,分别是启动类加载器、扩展类加载器和应用程序类加载器。
1. 启动类加载器:启动类加载器负责加载核心库中的Java类,它是虚拟机的一部分,是用原生代码实现的。
2. 扩展类加载器:扩展类加载器负责加载JRE扩展目录中的Jar包,主要包括java.ext.dirs系统属性指定的目录。
3. 应用程序类加载器:应用程序类加载器负责加载应用程序类路径上的类,是最常用的类加载器。
除了这三个核心类加载器,Java还提供了自定义类加载器,开发人员可以根据需要实现自定义类加载器,实现类加载过程的特殊需求。
三、双亲委派模型Java类加载器采用双亲委派模型进行类加载,即在加载类时,先委派给父类加载器加载,只有在父类加载器无法加载时才会自己尝试加载。
Java类加载机制详解

Java类加载机制详解Java是一种面向对象的编程语言,其强大之处在于其类加载机制。
类加载机制是Java虚拟机(JVM)用于将类的字节码加载到内存中,并对其进行解析、验证、准备和初始化的过程。
本文将详细介绍Java 类加载机制的原理与步骤。
一、类加载的过程Java类加载机制可以分为三个步骤:加载、连接和初始化。
1. 加载类的加载是指将类的字节码文件从文件系统或网络中读取到内存中的过程。
在加载阶段,JVM会通过类的全限定名来定位并读取对应的字节码文件。
加载过程可以通过类加载器来完成,类加载器负责根据类的全限定名查找字节码文件,并将其加载到JVM的方法区中。
2. 连接连接是指将类的字节码文件转化为可以被JVM直接使用的运行时数据结构的过程。
连接过程分为三个阶段:验证、准备和解析。
a. 验证验证阶段主要对字节码文件进行验证,包括文件格式验证、语义验证和字节码验证。
通过验证可以确保加载的类是合法、有效、安全的。
b. 准备准备阶段是为类的静态变量分配内存并设置默认初始值。
在准备阶段,JVM会为类的静态变量分配内存空间,并根据其类型设置默认初始值。
c. 解析解析阶段是将类中的符号引用替换为直接引用的过程。
在解析阶段,JVM会将类的符号引用转化为直接引用,使得各个类能够正确地相互调用。
3. 初始化初始化阶段是为类的静态变量赋予正确的初始值,并执行类中定义的静态代码块。
在初始化阶段,JVM会按照顺序执行类的静态变量赋值和静态代码块,并确保每个类的静态变量都有正确的初始值。
二、类加载器类加载器是Java类加载机制的关键组成部分,它负责在运行时动态地加载类的字节码文件。
Java的类加载器可以分为三种类型:1. 启动类加载器(Bootstrap Class Loader):负责加载Java的核心类库,如rt.jar等。
2. 扩展类加载器(Extension Class Loader):负责加载Java的扩展类库,如jre/lib/ext目录下的jar包。
JVM工作原理

JVM工作原理标题:JVM工作原理引言概述:Java虚拟机(JVM)是Java程序运行的核心组件,它负责将Java 源代码编译成字节码并在特定平台上运行。
了解JVM的工作原理对于开发人员来说至关重要,因为它影响着程序的性能和稳定性。
一、类加载器(ClassLoader)1.1 类加载器的作用是将编译后的字节码文件加载到内存中。
1.2 JVM中有三种类加载器:启动类加载器、扩展类加载器和应用程序类加载器。
1.3 类加载器采用双亲委派模型,即先由父类加载器尝试加载类,如果父类加载器无法加载,则由子类加载器加载。
二、运行时数据区(Runtime Data Area)2.1 运行时数据区包括方法区、堆、栈、程序计数器和本地方法栈。
2.2 方法区存储类的结构信息、静态变量、常量等。
2.3 堆用于存储对象实例,是Java内存管理的核心区域。
三、执行引擎(Execution Engine)3.1 执行引擎负责执行字节码指令。
3.2 JVM有两种执行引擎:解释器和即时编译器。
3.3 解释器逐条解释字节码指令执行,即时编译器将热点代码编译成本地机器码执行。
四、垃圾回收器(Garbage Collector)4.1 垃圾回收器负责回收不再使用的对象,释放内存空间。
4.2 JVM中有多种垃圾回收算法,如标记-清除算法、复制算法、标记-整理算法等。
4.3 垃圾回收器的性能直接影响程序的运行效率和响应速度。
五、本地方法接口(Native Interface)5.1 本地方法接口允许Java程序调用本地方法实现与操作系统交互。
5.2 本地方法接口提供了Java和本地代码之间的桥梁。
5.3 本地方法接口的使用需要谨慎,因为调用本地方法可能导致程序的不稳定性和安全性问题。
结论:JVM作为Java程序的核心组件,其工作原理涉及类加载器、运行时数据区、执行引擎、垃圾回收器和本地方法接口等多个方面。
了解JVM的工作原理有助于开发人员编写高效、稳定的Java应用程序。
jvm 深入理解java 虚拟机 简书

一、Java虚拟机概述Java虚拟机(JVM)是Java程序运行的核心部分,它是一个能够在不同评台上运行Java字节码的虚拟机。
通过将Java源代码编译为字节码,JVM可以在不同操作系统上运行,实现了“一次编写,到处运行”的特点。
JVM的出现极大地推动了Java语言的普及和发展。
二、JVM的工作原理1. 类加载器JVM通过类加载器(ClassLoader)来加载Java类文件,将类文件转换成Class对象。
2. 运行时数据区JVM的运行时数据区包括方法区、堆、虚拟机栈、本地方法栈、程序计数器等。
其中,堆用于存放对象实例和数组,而虚拟机栈则用于存放方法的局部变量表、操作数栈和动态信息等信息。
3. 执行引擎执行引擎负责在运行时执行Java字节码指令,其中包括解释器和即时编译器等部分,负责将字节码转换为机器码执行。
4. 本地方法接口JVM的本地方法接口(Native Interface)允许Java调用本地C、C++等语言编写的函数,从而实现与底层系统的交互。
三、JVM参数调优1. 堆大小调优通过-Xms和-Xmx参数可以设置JVM的初始堆大小和最大堆大小,合理的设置堆大小可以避免内存溢出和性能问题。
2. 垃圾回收调优通过设置-XX:+UseG1GC等参数可以调优JVM的垃圾回收器,从而减少GC停顿时间、提高程序性能。
3. 线程栈大小调优通过设置-Xss参数可以调优线程栈的大小,避免因为线程栈过小导致的栈溢出异常。
四、性能分析与调优工具1. JConsoleJConsole是JDK自带的性能分析工具,可以通过连接远程或本地的JVM进程,监控堆、线程、类、GC等信息。
2. VisualVMVisualVM是一个基于Eclipse评台的性能分析工具,支持多种插件,能够进行堆分析、线程分析、CPU分析等。
3. JProfilerJProfiler是一款商业性能分析工具,提供了丰富的性能分析功能和图形化界面,适合企业级应用的性能调优。
深入理解java虚拟机(八)类加载过程详解

深⼊理解java虚拟机(⼋)类加载过程详解类从被加载到虚拟机内存开始,到卸载出内存为⽌,它的整个⽣命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使⽤(Using)和卸载(Unloading)7个阶段。
其中,验证、准备和解析统称为连接(Linking)。
过程如下图所⽰。
下⾯我们来详细讲解Java虚拟机类中加载的5个过程,即加载、验证、准备、解析和初始化五个过程。
第⼀步:加载“加载”是虚拟机类加载的第⼀个阶段,在这个阶段中,虚拟机要完成3件事情:1. 通过权限定名,获取类的⼆进制字节流2. 将字节流的静态数据结构转化为⽅法区的运⾏时数据结构3. 在内存中⽣成⼀个代表这个类的 ng.Class 对象,作为⽅法区中这个类数据结构的访问⼊⼝⽽获取类的⼆进制流⼜有很多种⽅式:从压缩包中获取,⽐如 JAR包、EAR、WAR包等从⽹络中获取,⽐如红极⼀时的Applet技术从运⾏过程中动态⽣成,最出名的便是动态代理技术,在ng.reflect.Proxy 中,就是⽤了 ProxyGenerator.generateProxyClass 来为特定接⼝⽣成形式为“$Proxy”的代理类的⼆进制流从其它⽂件⽣成,如JSP⽂件⽣成Class 类从数据库中读取,⽐如说有些中间件服务器,通过数据库完成程序代码在集群之间的分发相对于类加载中的其它阶段,“加载”这⼀阶段是开发⼈员可控性最强的阶段。
因为“加载”阶段既可以使⽤系统提供的引导类加载器完成,也可以由⽤户⾃定义的类加载器完成。
即开发⼈员可以根据实际需要指定⼆进制数据流的获取⽅式。
对于数组类来说,它不是由虚拟机加载得来的,⽽是在运⾏过程中直接创建的。
其创建过程遵循以下规则:如果数组的组件类型(数组去掉⼀个维度的数据类型)是引⽤类型,就递归使⽤这些引⽤类型的类加载器进⾏加载。
Java类装载机制的研究及应用

sna Et t dr x 负责加载 i a a d d . 扩展类 ( A v ¥ — J V H M /e i et目录 中 的 所 有 A O Ej /b x r l/ 类 )ss m负 责加载 Casa , t ye lsP t h中设 置 的路径的类, 它是默认的类加载器 , 一般 用户应用程序的类都由此加载器负责加 载。所有用户 自 定义加载器都必须继承 j aagC sL ae 类,通过调用用户 a n Jasodr vl l 自定 义加载器的 l d ls 方法来加载 a Cas o
_
3类装载器的装载模式和过程 图3 3 装载模式 。i a . 1 a 类加载模式称 v A I ,a drx加 载¥AV — MEjei P 类 s n eE t t J A HO I / rl 为双亲委派加载模式,当—个类加载器被要求加 e a r a n e Ca t s 载某个类时, 它先委托它的父加载器加载这个类 , b x下面的 i 包,而包含 m i 方法 的T s l s /t ye t 噻E 器加载。 当运行到 S n r t gt i r s 父加载器再委托它的父加载器加载这个类 ,直到 类则 由ss m e tn " l’ i h o) ;时 , s m 加 载 器 委 托 st ye 某个加载器能够加载 或者已经加载 了这个类为 = nw Sr g( elf s n eE t t d rx加载器加载类 Sr gsadrx加载器 a tn ,t eE t i n 委托 bo t p ot a 类加载器加载, s r 而此时 bo t p类 ot r sa 加载器发现已经加载过 S i 类 , t g 程序向下运行 , r n T t e 类的加载过程也类似。当加载器要加载 n gr e Ts类时,ad rx类加载器和b tr 加载器 e t s ne t t E o sa tp 都无法加载, 则由T s l s e Ca 类所在的 ss m类加 t s yt e 如果 Ts类存放在 ss m类加载 et yt e 3 . 2装载过程。在运 载器负责加载 , a . s pt vc . h a 行 i a x 时, v. e a . e j ax 首 器的系统参数 j al s a 得到的搜索路径 的目 ve a e 则 yt e I e 1 t 先找到虚拟机运行环境 录下面时 , 由ss m类加载器就力 载 T s类 , 则 et 此时程序运行抛 J E中的 i  ̄l文 件 , 如果不在 , Ts类就无法加载, R v dl n 出异常。 启动虚拟机 由 bo t p 加 载 otr 类 sa 3 加载方式。 , 3 类的加载方式可分为两种显式 器加载核心 jvA I , 加载和隐式加载 aa P 类 显式加载 :通过 cas fr a 方法来加 l 的 oN me s s n ad x类 加 载 器加 t drE t a VA HO /e l MEj /b 载相 当 于 rl tigtl s (XX. tlsL ae.a Cas hse a . C s X )eCasodrod ls g 1 /t e 下的所有 i 包 , x a r 再  ̄ Xt e ̄ r , 由 sse ytm类加载器加载 0X ,u> 由 系 统 参 数 ials a .a v ̄ s Cas obe l s = CasoN me"aa l d u l a s Cs l .r a sf jv. a . Do l’ p t得 到的类的搜索路 1ng ub e a h 隐式加载 : 相当于使用当前正在执行的类的 径。 默认『况下 , 青 所有的jv 程序的 aa 包 含 m i(的人 口类 由 ss m 的 l d l s 加载器来加载类 , an ) yt e a c s0 o a 类都是通过 sse ytm类加载器由载的。 I 1 方法载人。 由N w关键字创建的某个类的—个实例, e 该 3 用户 自 . 4 定义类加载器的工作流程。 编写用 i Ca 方法即 n s 类由包含 n w语句类的类装载器的 l dls方法 户 自定义类加载器之需要重载 f d l s e o c s a a 载人 。 可。具l 图如图 3 示 。 僻耀 历_ 4类加载器的简单应用示例 下面我们看一段简单的程序来说 明加载的 用户 自定义的加载器使类 的加载和实例化 顺序 : 可以放到运行时决定 , 能够实现在线加载、 再现升 P bi casT s l s ul ls et a { c C s 级 的功 能,同时可 以扩展 c s l 文件的来源 , s a 使 P bi s t odm n tn a u l ti vi a ( r 扣 酬 c ac i Si b osrp ss m层 次的 Cas a e不仅仅能存 o tta yt e l L dr so Sr gs tn t i r=nw Sr  ̄’e o) e tn hl ’ i l1 ; 取本地的 c s ] 文件, s a 同时可以从网络 、 数据库等 It e.Sr  ̄ ) ne ro tn 5 g t i ; 处获得 c s 文件。 ls a 下面给出—个简单的运用类的
Java虚拟化技术的原理与实践

概述什么是Java虚拟化技术?Java虚拟机的基本概念Java虚拟机的工作原理Java程序的编译与执行过程JVM的基本组成和功能类加载器与字节码解释器JIT编译器和运行时优化Java虚拟化技术的应用服务器端应用移动设备应用嵌入式系统应用云计算和大数据应用Java虚拟化技术的挑战与未来性能问题与优化手段安全隐患与防范措施跨平台兼容性与标准化新兴技术的发展与应用结论Java虚拟化技术的原理与实践概述在计算机领域,Java虚拟化技术是一种通过Java虚拟机(JVM)实现的硬件和操作系统无关的编程方式。
它可以将Java程序编译成字节码,然后在不同的平台上运行。
本文将介绍Java虚拟化技术的原理和实践,深入探讨其在不同领域的应用和挑战,并展望其未来发展的方向。
Java虚拟机的工作原理Java程序的编译与执行过程在Java开发中,程序员首先使用Java编译器将Java源代码编译成字节码。
然后,这些字节码被加载到JVM中,并由JVM的解释器将其转换为机器码执行。
这种分阶段的执行方式有助于提高程序的可移植性和跨平台性。
JVM的基本组成和功能JVM由四个主要组件组成:类加载器、字节码解释器、即时编译器(JIT)和运行时数据区域。
类加载器负责加载和验证字节码文件,字节码解释器将字节码转换为机器码执行,JIT编译器则负责将热点代码编译为本地机器码以提高执行效率。
运行时数据区域包括堆、栈、方法区等,用于存储程序执行过程中的数据和运行时状态。
类加载器与字节码解释器类加载器是JVM的关键组件之一,它负责动态加载类文件并将其转换为可执行代码。
字节码解释器则负责解释和执行字节码指令。
这种分离的设计能够在运行时动态加载和执行代码,增强了程序的灵活性和可扩展性。
JIT编译器和运行时优化JIT编译器是JVM中的一个重要组件,它在运行时动态地将热点代码编译为本地机器码。
通过使用JIT编译器,Java虚拟机能够实现更高的执行效率,减少解释器的性能损失。
Java虚拟机结构与实现研究

Java虚拟机结构与实现研究Java虚拟机是一种抽象的计算机,它利用字节码作为它的指令集,并且提供了跨平台的能力。
Java虚拟机可以在不同的操作系统上进行移植,从而保持一致的行为。
为了实现跨平台,Java虚拟机需要具有一个明确的结构和实现方式。
这篇文章将重点介绍Java虚拟机的结构和实现方式,以帮助读者更好地理解和应用它。
1. Java虚拟机的结构Java虚拟机的结构分为五个部分:类加载器、运行时数据区、执行引擎、本地方法接口和Java Native Interface。
1.1 类加载器类加载器是Java虚拟机的重要组成部分,它用于将类加载到运行时数据区,使得Java程序能够使用这些类。
类加载器是Java虚拟机在运行时动态加载类的机制,其实现方式为“委托机制”。
1.2 运行时数据区运行时数据区是Java虚拟机管理内存的地方。
Java虚拟机运行时,会在内存中创建一个运行时数据区,包括四个部分:方法区、堆、虚拟机栈和本地方法栈。
1.3 执行引擎Java虚拟机通过执行引擎将字节码转化为可执行的指令,并利用运行时数据区中的数据作为执行时的输入和输出。
执行引擎由解释器和即时编译器两部分组成。
1.4 本地方法接口本地方法接口(Native Method Interface)是Java虚拟机所提供的一种与本地方法库交互的机制,它允许Java应用程序调用C/C++实现的方法。
1.5 Java Native InterfaceJava Native Interface(JNI)是Java虚拟机所提供的一种与本地语言(如C/C++)交互的机制,它允许Java程序通过JNI调用本地语言的方法。
2. Java虚拟机的实现方式Java虚拟机有两种主要的实现方式:解释执行和即时编译。
2.1 解释执行解释执行是Java虚拟机最初的实现方式,它将字节码转化为可执行的指令,并在运行时逐条执行这些指令。
由于解释执行时需要不断地解析字节码,因此比较慢。
Java 虚拟机类装载机制、原理和应用实例

Java 虚拟机类装载机制、原理和应用实例
在本单元重点了解如下知识点 Java虚拟机及作用 JVM中的类加载器 Java平台中的系统库 Java 类(*.class)文件
1、Java虚拟机 (1)什么是Java虚拟机(JVM) JVM是可运行Java代码的“软件化”的计算机,主要任 务是装载*.class类文件并且执行其中的字节码(由其 中的执行引擎模块具体执行)。 Java虚拟机包含有类装载器,并且只有程序在执行时 需要的那些类才会被装载。 只要遵守JVM规范并提供不同操作系统平台的Java解释 器,就能保证经过编译的任何Java类代码能够在该操 作系统中运行。 Байду номын сангаас2)Java虚拟机有自己的“硬件”(如处理器、堆栈、寄 存器等)和具有相应的“指令系统”——它们共同构成 “JVM规范” JVM中的执行引擎被设计为一个自适应的优化器,一个自 适应的优化器可以大大地提高Java虚拟机本身的性能。
(2)应用Java API编程可以保证应用与平台无关性 如果希望应用系统真正地能够达到与平台的无关性, 必须要通过Java API来访问底层系统的各种资源。 (3)应用JNI接口调用本地系统库 但如果希望使用特定主机上的系统资源,且又无法通 过Java API访问,可以编写一个平台相关的代码调用本地 方法——应用JNI接口调用本地系统库。 (4)Java API也是Java程序运行库的集合 它为开发人员提供了一套访问目标主机系统资源(操 作系统和硬件端口等)的标准方法。 (5)平台系统如何支持Java技术 为了能够在目标平台中支持Java程序,必须要在这个 特定平台上明确地实现Java API中的各个方面的功能—— Java API然后再调用该平台的本地方法。
Java虚拟机类装载:原理、实现与应用

Java虚拟机类装载:原理、实现与应用作者:刘学超一、引言Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程。
JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行。
本文将分析JVM中的类装载系统,探讨JVM 中类装载的原理、实现以及应用。
二、Java虚拟机的类装载实现与应用2.1 装载过程简介所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的class对象的过程,其中类或接口的名称是给定了的。
当然名称也可以通过计算得到,但是更常见的是通过搜索源代码经过编译器编译后所得到的二进制形式来构造。
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:▪装载:查找和导入类或接口的二进制数据;▪链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;▪校验:检查导入类或接口的二进制数据的正确性;▪准备:给类的静态变量分配并初始化存储空间;▪解析:将符号引用转成直接引用;▪初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
至于在类装载和虚拟机启动的过程中的具体细节和可能会抛出的错误,请参看《Java虚拟机规范》以及《深入Java虚拟机》,它们在网络上面的资源地址是:/docs/books/vmspec/2nd-edition/html/Preface.doc.html和/insidejvm/ed2/index.html。
由于本文的讨论重点不在此就不再多叙述。
2.2 装载的实现JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。
跟我学Java入门到精通培训教程——Java 虚拟机类装载机制、原理和应用实例

1.1Java 虚拟机类装载机制、原理和应用实例1、JVM中的类装载器(Classloader)(1)类文件必须首先加载到JVM内存中执行由于Java程序(class文件)并不是本地的可执行程序,因此在运行Java程序时,首先JVM (Java虚拟机)要把目标Java 类文件加载到JVM中的CodeSegment(代码段)中运行,负责加载Java类文件的这部分程序就叫做Class Loader。
因此Classloader也叫做类加载器。
(2)JVM的类动态装载技术JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行。
(3)什么是JVM中的类装载器Java中的所有类必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中——类装载就是寻找一个类或是一个接口的字节码文件并通过解析该字节码来构造代表这个类或是这个接口的class 对象的过程。
(4)类装载器把一个类装入JVM中一般要经过如下三个步骤来完成装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的。
2、各个步骤的主要工作内容(1)装载查找和导入类或接口的字节码;(2)链接执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的。
1)校验:检查导入类或接口的二进制数据的正确性;2)准备:给类的静态变量分配并初始化存储空间;3)解析:将符号引用转成直接引用;(3)初始化激活类的静态变量的初始化Java 代码和静态Java 代码块。
3、Java中的类文件大致分为三种(1)系统类(2)扩展类(3)由程序员自定义的类4、Java中类装载方式有两种(1)隐式装载程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到JVM中。
(2)显式装载通过Class.forName(“目标类名称”)等方法,显式加载需要的类(3)隐式加载与显式加载两者在本质上是一样的,可以通过下面的示例说明:package com.px1987.javaexample;public class UserInfoVO {String userName;int userAge;public UserInfoVO() {}public void setUserAge(int newAge){userAge=newAge;newAge=1;}public void setUserName(String newUserName){userName=newUserName;newUserName="新的用户名称";}public String getUserName(){return userName;}public void setUserInfo(UserInfoVO oneUserInfoVO){oneUserInfoVO.setUserName("新的用户名称");}public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException{UserInfoVO oneUserInfoVO=new UserInfoVO();oneUserInfoVO.setUserName("张三");System.out.println("oneUserInfoVO="+oneUserInfoVO.getUserName());Class someOneClassObj=Class.forName("erInfoVO");UserInfoVO twoUserInfoVO=(UserInfoVO)someOneClassObj.newInstance();twoUserInfoVO.setUserName("张三");System.out.println("twoUserInfoVO="+oneUserInfoVO.getUserName());}}下面为本示例程序的执行结果:(4)利用java -verbose class可以观察类的具体加载过程5、JVM对类文件的加载是采用“动态加载”机制实现的(1)延迟加载由于一个Java应用程序总是由N多个类所组成的,当该Java应用程序启动并被开始执行时,JVM并不是一次性地把所有的类文件全部加载到内存中后再运行它们,JVM总是先把保证程序运行的JRE中的基础类库中的类文件一次性地加载到JVM内存中,而其它的类文件则需要等到JVM用到的时候再实际加载。
Java虚拟机类装载原理、实现与应用

Java 虚拟机类装载:原理、实现与应用一、引言Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程。
JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行。
本文将分析JVM中的类装载系统,探讨JVM中类装载的原理、实现以及应用。
二、Java虚拟机的类装载实现与应用2.1 装载过程简介所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的class对象的过程,其中类或接口的名称是给定了的。
当然名称也可以通过计算得到,但是更常见的是通过搜索源代码经过编译器编译后所得到的二进制形式来构造。
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:装载:查找和导入类或接口的二进制数据;链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;校验:检查导入类或接口的二进制数据的正确性;准备:给类的静态变量分配并初始化存储空间;解析:将符号引用转成直接引用;初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
至于在类装载和虚拟机启动的过程中的具体细节和可能会抛出的错误,请参看《Java 虚拟机规范》以及《深入Java虚拟机》,它们在网络上面的资源地址是:/docs/books/vmspec/2nd-edition/html/Preface.doc.html 和/insidejvm/ed2/index.html。
由于本文的讨论重点不在此就不再多叙述。
2.2 装载的实现JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。
它负责在运行时查找和装入类文件的类。
Java虚拟机(JVM)的基本原理和优化

Java虚拟机(JVM)的基本原理和优化Java虚拟机(JVM)是Java程序运行的基石,它负责将Java代码编译成机器可以执行的二进制码,并提供内存管理和垃圾回收等方面的支持。
本论文主要介绍JVM的基本原理和优化方法。
一、JVM的基本原理JVM是运行在操作系统上的一个软件,它屏蔽了底层操作系统的硬件差异,使得Java程序可以在不同的操作系统上运行。
JVM主要由三部分组成:类加载器、执行引擎和运行时数据区。
1.类加载器类加载器主要负责将Java源代码编译成字节码(即.class文件)并加载到JVM中。
类加载器分为三种:启动类加载器、扩展类加载器和应用程序类加载器。
启动类加载器加载的是JRE中的核心类库,扩展类加载器加载的是可选的扩展类库,而应用程序类加载器则负责加载应用程序所需的类。
类加载器会将加载的类保存在一块特定的内存区域中,称为方法区(或永久代)。
在类加载器加载一个类时,会首先检查该类是否已经被加载过。
如果已经被加载,则直接返回该类的Class对象;否则,会按照一定的顺序依次执行加载、链接和初始化三个步骤。
2.执行引擎执行引擎负责将Java字节码解释为底层计算机的指令,执行程序。
执行引擎通常采用的两种方式是解释执行和即时编译。
解释执行是指将字节码逐条解释翻译成机器码并执行。
这种方式的优点是可以快速启动,适用于简单的场景;缺点是运行速度慢,占用系统资源多。
即时编译是指将字节码在程序运行的过程中翻译成本地机器码并执行。
这种方式的优点是运行速度快,适用于复杂的场景;缺点是启动时消耗资源多,使用内存较多。
3.运行时数据区运行时数据区是JVM提供的内存管理机制。
它根据Java程序需要使用的内存大小动态地分配和回收内存,包括堆内存、栈内存、方法区(或永久代)以及本地方法栈。
堆内存主要用来存储Java对象,堆内存的大小和JVM的内存上限有关系。
栈内存主要用来存储方法的局部变量和方法调用的相关信息,栈内存的大小通常是固定的。
虚拟机加载机制

Java虚拟机类加载机制虚拟机类加载机制:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
Java语言里,类型的加载和连接过程是在程序运行期间完成的。
类的生命周期:加载loading验证verification准备preparation解析resolution初始化initialization使用using卸载unloading有且只有以下四种情况必须立即对类进行”初始化”(称为对一个类进行主动引用):1.遇到new、getstatic、putstatic、invokestatic这四条字节码指令时(使用new实例化对象的时候、读取或设置一个类的静态字段、调用一个类的静态方法)。
2.使用ng.reflet包的方法对类进行反射调用的时候。
3.当初始化一个类的时候,如果发现其父类没有进行过初始化,则需要先触发其父类的初始化。
4.当虚拟机启动时,虚拟机会初始化主类(包含main方法的那个类)。
被动引用:1.通过子类引用父类的静态字段,不会导致子类初始化(对于静态字段,只有直接定义这个字段的类才会被初始化)。
2.通过数组定义类应用类:ClassA [] array=new ClassA[10]。
触发了一个名为[LClassA的类的初始化,它是一个由虚拟机自动生成的、直接继承于Object的类,创建动作由字节码指令newarray触发。
3.常量会在编译阶段存入调用类的常量池。
编译器会为接口生成<clinit>()构造器,用于初始化接口中定义的成员变量。
一个接口在初始化时,并不要求其父类接口全部完成了初始化,只有在真正使用到父接口的时候才会初始化。
1. 加载1.通过一个类的全限定名来获取此类的二进制字节流。
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3.在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。
Java虚拟机的原理与调优方法

Java虚拟机的原理与调优方法Java虚拟机的原理与调优方法在计算机编程领域,Java是一种广泛应用的高级编程语言。
Java程序在计算机中运行时,需要通过Java虚拟机(Java Virtual Machine,简称JVM)来执行。
本文将介绍Java虚拟机的原理以及调优方法。
一、Java虚拟机的原理Java虚拟机是一个能够在不同操作系统上执行Java字节码的软件程序。
它实现了Java字节码的解释和执行过程,提供了内存管理、垃圾回收、线程管理等功能。
1. Java字节码Java源代码通过Java编译器编译成字节码文件(.class文件),字节码是一种中间代码,它是一种平台无关的二进制格式,可以在各种操作系统上执行。
2. 类加载器当Java程序启动时,Java虚拟机会先执行类加载的过程。
类加载器负责加载字节码文件,并将其转换为能够被虚拟机执行的内部表示。
3. 运行时数据区Java虚拟机将内存分为不同的区域,包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。
这些区域分别用于存放类的信息、对象实例、线程执行时的栈帧、本地方法调用等。
4. 垃圾回收Java虚拟机通过垃圾回收机制来自动释放不再使用的内存资源。
垃圾回收器识别无用的对象,并将其回收,释放内存空间供其他对象使用。
二、Java虚拟机的调优方法为了提高Java程序的性能和效率,我们可以通过一些调优方法对Java虚拟机进行优化。
1. 内存分配与回收Java虚拟机负责管理程序的内存分配和回收。
合理设置堆大小、新生代和老年代的大小,可以减少内存碎片和垃圾回收次数,从而提高程序的效率。
2. 垃圾回收调优选择合适的垃圾回收器可以提高程序的性能。
不同的垃圾回收器有各自的优缺点,可以根据程序的特点选择适合的垃圾回收器。
3. 线程优化Java虚拟机使用线程来执行Java程序。
合理设置线程的数量和优先级,能够提高程序的并发性能。
4. JIT编译器Java虚拟机内置了即时编译器(Just-In-Time Compiler,简称JIT),能够将热点代码编译成本地机器码,进一步提高程序的执行速度。
Java工作原理

Java工作原理Java是一种广泛使用的编程语言,被用于开发各种应用程序和系统。
了解Java的工作原理对于理解和优化Java程序至关重要。
本文将详细介绍Java的工作原理,包括Java虚拟机(JVM)、Java编译器和Java运行时环境(JRE)等方面的内容。
一、Java虚拟机(JVM)Java虚拟机(JVM)是Java程序的运行环境,它负责将Java源代码编译成可执行的字节码文件,并在运行时解释执行字节码。
JVM提供了内存管理、垃圾回收、线程管理等功能,使得Java程序具有跨平台的特性。
1. 类加载器类加载器是JVM的重要组成部分,它负责将字节码文件加载到内存中,并生成对应的类对象。
JVM中有三种类加载器:启动类加载器、扩展类加载器和应用程序类加载器。
类加载器按照一定的顺序加载类,并建立类之间的依赖关系。
2. 字节码解释器字节码解释器是JVM的核心组件,它负责将字节码文件解释为机器指令并执行。
字节码解释器可以实现跨平台的特性,因为不同的操作系统只需要实现对应的字节码解释器即可。
3. 即时编译器即时编译器(Just-In-Time Compiler,JIT)是JVM的另一个重要组件,它负责将热点代码(被频繁执行的代码)编译成本地机器码,以提高程序的执行效率。
JIT编译器使用了各种优化技术,如方法内联、循环展开等,以生成高效的本地机器码。
二、Java编译器Java编译器是将Java源代码编译成字节码文件的工具。
Java源代码是以.java为扩展名的文本文件,编译器将源代码转换为字节码文件,以.class为扩展名。
Java编译器具有以下主要功能:1. 词法分析词法分析是编译器的第一步,它将源代码分解成一个个的词法单元,如关键字、标识符、运算符等。
词法分析器会忽略空格、注释等无关的字符。
2. 语法分析语法分析是编译器的第二步,它根据词法单元构建语法树,检查源代码是否符合语法规则。
语法分析器会检测语法错误,并生成相应的错误信息。
jvm虚拟机的工作原理和流程

jvm虚拟机的工作原理和流程JVM虚拟机的工作原理和流程JVM(Java Virtual Machine)是Java程序的运行环境,它负责将Java源代码编译成字节码并执行。
JVM的工作原理和流程可以分为以下几个步骤。
1. 代码编译阶段在代码编译阶段,Java源代码通过Java编译器(javac)转换为字节码文件(.class文件)。
字节码是一种中间代码格式,它是一种与平台无关的二进制文件,可以在任何支持JVM的平台上运行。
2. 类加载阶段在类加载阶段,JVM将字节码文件加载到内存中。
类加载器负责加载字节码文件,并将其转换为JVM能够理解的数据结构。
JVM的类加载器包括启动类加载器、扩展类加载器和应用程序类加载器。
这些加载器按照一定的顺序逐级加载字节码文件。
3. 内存分配阶段在内存分配阶段,JVM为每个类分配内存空间。
JVM将内存分为多个区域,包括堆、栈、方法区和本地方法栈等。
其中,堆用于存储对象实例,栈用于存储局部变量和方法调用信息,方法区用于存储类的结构信息和常量池等。
4. 字节码解释执行阶段在字节码解释执行阶段,JVM通过解释器对字节码进行解释执行。
解释器逐条解释字节码指令,并执行相应的操作。
解释执行的优点是实现简单,但执行效率相对较低。
5. 即时编译阶段在即时编译阶段,JVM将热点代码(被频繁执行的代码)进行即时编译优化。
即时编译器将字节码转换为本地机器码,提高执行效率。
即时编译器使用的编译策略包括栈上替换、内联缓存和逃逸分析等。
6. 垃圾回收阶段在垃圾回收阶段,JVM通过垃圾回收器对不再使用的对象进行回收。
垃圾回收器会标记和清理堆中的垃圾对象,并释放相应的内存空间。
JVM提供了不同类型的垃圾回收器,如串行回收器、并行回收器和并发回收器等。
7. 异常处理阶段在异常处理阶段,JVM通过异常处理机制捕获和处理程序中的异常。
当程序抛出异常时,JVM会查找相应的异常处理器,并执行相应的异常处理代码。
java虚拟机原理

java虚拟机原理Java虚拟机(Java Virtual Machine,JVM)是Java程序的运行环境,它是Java 语言的核心,承担着将Java源代码转换为机器码并执行的任务。
了解Java虚拟机的原理对于理解Java程序的运行机制和性能优化至关重要。
首先,Java虚拟机的核心功能是将Java源代码编译成字节码,并在运行时将字节码转换为机器码执行。
这种设计使得Java程序具有跨平台的特性,因为字节码是与特定平台无关的中间代码。
Java虚拟机通过解释执行和即时编译两种方式来执行字节码。
解释执行是逐条解释字节码指令并执行对应的操作,而即时编译则是将字节码直接编译成机器码,以提高执行效率。
其次,Java虚拟机的内存管理是其重要的功能之一。
Java程序在运行过程中会动态分配和回收内存,而Java虚拟机负责管理这些内存分配和回收的工作。
Java 虚拟机的内存模型包括堆、栈、方法区等部分,每部分都有着不同的作用和特点。
堆用于存储对象实例,栈用于存储局部变量和方法调用信息,方法区则用于存储类的结构信息、常量池等数据。
此外,Java虚拟机还包括了垃圾回收器(Garbage Collector,GC)来进行自动的内存回收。
垃圾回收器负责识别和回收不再被程序所引用的对象,以释放内存空间。
不同的垃圾回收算法和策略会对程序的性能产生不同的影响,因此垃圾回收器的选择和调优对于Java程序的性能优化至关重要。
此外,Java虚拟机还包括了即时编译器(Just-In-Time Compiler,JIT)来提高程序的执行效率。
即时编译器会将热点代码(即频繁执行的代码)直接编译成机器码,以取代解释执行的方式,从而提高程序的运行速度。
即时编译器的优化技术和策略对于程序的性能有着直接的影响,因此对于即时编译器的原理和优化技术的了解也是非常重要的。
总之,Java虚拟机是Java程序的核心,了解其原理对于理解Java程序的运行机制和性能优化至关重要。
Java虚拟机类加载机制

Java虚拟机类加载机制虚拟机类加载机制:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
Java语言里,类型的加载和连接过程是在程序运行期间完成的。
类的生命周期:加载 loading验证 verification准备 preparation解析 resolution初始化 initialization使用 using卸载 unloading有且只有以下四种情况必须立即对类进行”初始化”(称为对一个类进行主动引用):1.遇到new、getstatic、putstatic、invokestatic这四条字节码指令时(使用new实例化对象的时候、读取或设置一个类的静态字段、调用一个类的静态方法)。
2.使用/doc/1b15253901.html,ng.reflet 包的方法对类进行反射调用的时候。
3.当初始化一个类的时候,如果发现其负类没有进行过初始化,则需要先触发其父类的初始化。
4.当虚拟机启动时,虚拟机会初始化主类(包含main方法的那个类)。
被动引用:1.通过子类引用父类的静态字段,不会导致子类初始化(对于静态字段,只有直接定义这个字段的类才会被初始化)。
2.通过数组定义类应用类:ClassA [] array=new ClassA[10]。
触发了一个名为[LClassA的类的初始化,它是一个由虚拟机自动生成的、直接继承于Object的类,创建动作由字节码指令newarray触发。
3.常量会在编译阶段存入调用类的常量池。
编译器会为接口生成()构造器,用于初始化接口中定义的成员变量。
一个接口在初始化时,并不要求其父类接口全部完成了初始化,只有在真正使用到父接口的时候才会初始化。
1. 加载1.通过一个类的全限定名来获取此类的二进制字节流。
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3.在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java虚拟机中类装载机制的原理分析与应用研究李超,方潜生(安徽建筑工业学院计算机与信息工程系,合肥230022)摘要:Java类的动态装载机制是Java虚拟机的一项核心技术,可以在运行时刻动态地加载或替换系统的某些功能模块,而不影响系统其它功能模块的正常运行。
本文介绍了Java虚拟机中类的动态装载机制的原理、实现及应用,分析了类装载器的结构、用途,阐述了利用自定义类装载器装载并执行Java 类的过程。
关键词:Java类;动态装载机制;Java虚拟机;类装载器中图分类号:TP311文献标识码:A文章编号:1006-4540(2005)05-069-04The principle analysis and application study of classloading mechanisminside Java Virtual MachineLi Chao,Fang Qian-sheng(Dept.of Computer and Information Engineering,Anhui Institute of Architecture&Industry,Hefei 230022,China)Abstract:The dynamic loading mechanism of Java Class is a core technique inside Java Virtual Ma-chine. It can dynamically loading or substitute some system function modules,without affecting othersystem modules. This paper introduced the principles、realization and applications of dynamic Class-loading mechanism inside Java Virtual Machine. It also analyzed the frame and purpose of ClassLoad-er. The process loading and performing Java Class with user-defined ClassLoader was also expatiatedin detail.Key words:Java Class;dynamic loading mechanism;Java Virtual Machine;ClassLoader Java虚拟机(JVM)的类装载是指将包含在类文件中的字节码装载到JVM中,并使其成为JVM一部分的过程。
JVM中类的动态装载技术能够在运行时刻动态地加载或替换系统的某些功能模块,而不影响系统其它功能模块的正常运行。
本文将分析JVM中的类装载系统,探讨JVM中类装载的原理、实现及应用,并将详细阐述利用自定义的类装载器(ClassLoader)装载并执行Java类的过程。
1JVM类装载的原理Java应用程序使用两种类型的类装载器:根装载器(bootstrap)和用户自定义的装载器(user-defined)。
根装载器是Java虚拟机实现的一部分,例如,如果一个Java虚拟机是在当前已存在并且正被使用的操作系统的顶部用C程序来实现的,那么根装载器即是这些C程序的一部分。
根装载器以某种默认的方式将类装入———包括那些Java API的类。
在运行期间Java程序能安装用户自定义的类装载器。
根装载器是虚拟机固有的一部分,而用户自定义的类装载器则不是:它用Java语言编写,被编译成class文件之后再被装入到虚拟机,并且像其它的任何对象一样可以被实例化。
Java类装载器的体系结构如图1所示。
图1Java类装载器的体系结构图Java的类装载模型是一种代理(delegation)模型。
当JVM要求类装载器CL(ClassLoader)装载一个类时,CL首先将这个类装载请求转发给其父装载器。
只有当父装载器没有装载并且无法装载这个类时,CL才获得装载这个类的机会。
这样,所有类装载器的代理关系便构成了一种树状的关系。
树的根是类的根装载器(bootstrap ClassLoader),在JVM中它用“null”表示。
除根装载器以外的类装载器有且仅有一个父装载器。
在创建一个装载器时,如果没有显式地给出其父装载器,那么JVM将默认系统装载器为其父装载器。
Java的基本类装载器代理结构关系如图2所示。
图2Java类装载器的代理结构图各种类装载器的功能和特点如下:(1)根(Bootstrap)装载器:该装载器没有父装载器,它是JVM实现的一部分,从sun.boot.class.path处装载运行时库的核心代码;(2)扩展(Exten- sion)装载器:继承的父装载器为根装载器,不像根装载器可能与运行时的操作系统有关,这个类装载器用纯Java代码实现,它从java.ext.dirs(扩展目录)中装载代码;(3)系统(System or Application)装载器:装载器为扩展装载器,我们所熟知的在安装JDK的时候要设置环境变量(CLASSPATH),这个类装载器就是从java.class.path(CLASSPATH环境变量)中装载代码的,它也是用纯Java代码实现的,同时还是用户自定义类装载器的缺省父装载器;(4)小应用程序(Applet)装载器:为系统装载器,它从用户指定网络上的特定目录装载小应用程序代码。
2JVM类装载的实现2.1类装载的过程所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或这个接口的class对象的过程,其中类或接口的名称是给定了的。
名称可以通过计算得到,也可以通过搜索源代码经过编译器编译后所得到的二进制形式来构造。
Java中类装载器把一个类装入Java虚拟机中,需要经过3个步骤:装载、链接和初始化,其中链接又分为校验、准备和解析3步;除解析外,其它步骤严格按照顺序完成,各个步骤的主要功能如下:(1)装载:查找和导入类或接口的二进制数据;(2)链接:执行下面的校验、准备和解析步骤,其中解析步骤是可选的;(3)校验:检查导入类或接口的二进制数据的正确性;(4)准备:为类的静态变量分配存储空间并初始化;(5)解析:将符号引用转成直接引用;(6)初始化:激活类的静态变量的初始化代码和静态Java代码模块。
Java中类的装载过程也即代理装载的过程。
例如:Web浏览器中的JVM需要装载一个小应用程序TestApplet,JVM通过调用小应用程序装载器ACL(Applet ClassLoader)来完成装载:(1)首先,ACL请求其父装载器即系统装载器装载TestApplet是否装载了这个类,由于TestApplet不在系统装载器的装载路径中,所以系统装载器无法找到这个类,也就没有装载成功;(2)然后, ACL自己装载TestApplet,ACL通过网络成功地找到了TestApplet.class文件并将它导入到JVM中;(3)在装载过程中,JVM发现TestAp-plet是从超类java.applet.Applet继承的,所以JVM再次调用ACL来装载java.applet.Applet 类;(4)ACL再次按上面的顺序装载Applet类,则ACL会发现其父装载器已经装载了这个类, 所以ACL就直接将这个已经装载的类返回给JVM,完成Applet类的装载;(5)接着,Applet类的超类也按同样过程处理;(6)最后,TestAp- plet及所有相关的类都已装载到JVM中。
2.2类装载的实现JVM中类的装载通过ClassLoader和其子类来实现,Java ClassLoader作为一个重要的Ja- va运行时系统组件,负责在运行时查找和装入类文件的类。
Java中的ClassLoader是一个抽象类,在包ng中。
ClassLoader中包括以下一些重要的方法:(1)loadClass方法:loadClass(String name, boolean resolve)中name参数指定了JVM需要的类的名称,该名称以包表示法表示,例如Java. lang.Object;resolve参数告诉方法是否需要解析类。
在初始化类之前,应考虑类解析,不是所有的类都需要解析。
如果JVM只需了解该类是否存在或只要找出该类的超类,那么就不需解析。
该方法是ClassLoader的入口点。
(2)defineClass方法:该方法接受类文件的字节数组并把它转换成Class对象,它把字节码分析成运行时数据结构、校验有效性等等。
字节数组可以是从本地文件系统或网络装入的数据。
(3)findSystemClass方法:findSystemClass方法从本地文件系统装入文件,它在本地文件系统中寻找类文件。
如果存在就使用defineClass 将字节数组转换成Class对象,将该文件转换成类。
该方法是Java应用程序运行时JVM正常装入类的缺省机制。
(4)resolveClass方法:resolveClass(Class c)方法解析装入的类,如果该类已被解析过则不作处理。
在调用loadClass方法时,通过该方法的resolve参数决定是否要进行解析。
(5)findLoadedClass方法:调用loadClass方法装入类时,通过调用findLoadedClass方法来查看ClassLoader是否已装入这个类。
如果已装入则返回Class对象,否则返回“NULL”;如果强行装载已存在的类,将会抛出链接错误。
在设计类装载器时,应满足以下两个条件:(1)对于相同的类名,类装载器返回的对象应是同一类对象;(2)如果类装载器CL1将装载类C的请求转给类装载器CL2,那么对于以下的类或接口, CL1和CL2应返回同一类对象:S为C的直接超类;S为C的直接超接口;S为C成员变量的类型;S为C的成员方法或构建器的参数类型;S为C成员方法的返回类型。
每个已经装载到JVM中的类都隐式地含有装载它的类装载器的信息,但是不能更改该类装载器。
类方法getClassLoader可以得到装载该类的类装载器的信息。
某个类装载器认识的类包括其父装载器认识的类和它自身装载的类,因而类装载器认识的类是其自身装载的类的一个超集。
3JVM类装载的应用通常,在利用Java虚拟机的类进行装载时需要继承抽象类ng.ClassLoader,其中必须实现的方法是loadClass()方法,对于该方法需实现如下操作:(1)确认类的名称;(2)检查请求要装载的类是否已被装载;(3)检查请求加载的类是否为系统类;(4)尝试从类装载器的存储区获取所请求的类;(5)在虚拟机中定义所请求的类;(6)解析所请求的类;(7)返回所请求的类。