基本原理
所有类都由类装载器载入,载入内存中的类对应一个 java.lang.Class 实例。
已被加载的类由该类的类加载器实例与该类的全路径名的组合标识。设有 packagename.A Class ,分别被类加载器 CL1 和 CL2 加载,则系统中有两个不同的 java.lang.Class 实例: <CL1, packagename.A> 和 <CL2, packagename.A> 。
存在一个 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 .装载一个类时,首先要装载该类的基类及其接口。
- 浏览: 794069 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
发表评论
-
堆内存和栈内存
2013-11-19 10:13 0堆内存就是你用new 修饰符创建的内容会在堆内存中开辟一段空 ... -
Eclipse中打开SVN控制台(转)
2013-05-15 10:36 1398SVN插件是Eclipse中的必装插件,经常在用Eclips ... -
eclipse c++的一些用法
2013-04-28 09:19 0用的Eclipse CDT Indigo + MinGW ... -
eclipse c++修改注释字体大小
2013-04-26 11:07 1105使用Eclipse C++发现注释的字体大小比代码的要小,看 ... -
eclipse c++中出现Type 'xxxx' could not be resolved的处理方法
2013-04-25 14:24 1672修改工程的indexer属性就OK了。 -
配置Eclipse+MinGW开发C/C++程序(转)
2013-04-25 14:02 908Eclipse 3.3已经发布好一 ... -
eclipse c++调用一个库
2013-04-25 13:54 1077在eclipse下调用一个库要干三件事,1,添加头文件地址2, ... -
Eclipse里添加java代码格式模板
2013-04-22 13:55 0Eclipse中设置Java方法注释模板,并使用方法注释 ... -
Eclipse C++下不构建指定文件
2013-04-18 13:56 803打开文件属性:在c/c++ build下的settings里 ... -
The CATALINA_HOME environment variable is not defined correctly
2013-04-10 14:32 13034问题:今天配置tomcat运行环境时出现了下边的问题, T ... -
生成校验码思路
2013-04-01 14:55 0一、生成校验码1.在jsp中让校验码的图片的src为动态的: ... -
导出excel的思路
2013-04-01 14:54 01.基本思路:根据前台查询条件,检索出数据后,再respos ... -
使用POI生成Excel文件,可以自动调整excel列宽等(转)
2013-03-31 14:38 10395//autoSizeColumn()方法自动调整excel列 ... -
poi hssf处理excel
2013-03-31 13:19 1196用POI HSSF处理EXCEL表格 POI ... -
poi-hssf小结
2013-03-31 13:16 1554一、概述 1. Apache POI是Apache软件 ... -
使用json-lib进行Java和JSON之间的转换
2013-03-27 10:36 925http://www.cnblogs.com/mailingf ... -
AJAX POST方法(转)
2013-03-27 10:08 759http://blog.sina.com.cn/s/blog_ ... -
dom4j转移字符问题
2013-03-22 13:36 1061http://lavasoft.blog.51cto.co ... -
java http
2013-03-20 13:22 01.client端访问网页: java访问网页操作,我们 ... -
freemarker
2013-03-18 11:30 0http://www.havenliu.com/java/5 ...
相关推荐
Java虚拟机类装载机制是Java运行环境中的核心组成部分,它负责将类的字节码从磁盘、网络等不同来源加载到JVM中,并进行一系列处理以使类能够被正确地使用。类装载机制的目的是为了实现代码的动态加载和运行时的灵活...
java类装载介绍,介绍了java装载类的先后顺序
Java虚拟机(JVM)是Java程序运行的核心,它的类装载机制是理解Java应用程序如何启动、运行和管理的关键。本文将深入探讨Java虚拟机的类装载机制,包括其原理、工作流程以及在实际开发中的应用。 类装载机制是Java...
Java虚拟机类装载机制是Java运行环境的核心技术之一,它允许程序在运行时动态加载和使用类,极大地增强了软件的灵活性和可扩展性。本文主要探讨了类装载的原理、实现方式及其在实际应用中的作用。 首先,类装载的...
所有JVM都内置了一个特殊的类装载器——根装载器(Bootstrap ClassLoader),它负责装载Java核心类库。当需要装载非设计时已知的类时,则需要使用用户自定义的类装载器。 #### 实例演示 以下是一个简单的示例,...
Java类装载器机制是Java语言灵活性的关键组成部分,尤其在J2EE应用服务器中扮演着重要角色。理解这一机制有助于开发者更好地部署和管理应用程序,解决可能出现的部署问题。 Java类装载器是Java虚拟机(JVM)的一...
Java虚拟机类装载 Java虚拟机(JVM)的类装载是指将包含在类文件中的字节码装载到JVM中...了解了JVM中的类装载机制和ClassLoader的工作原理,可以更好地理解Java虚拟机的工作机制,并更好地使用Java语言开发应用程序。
类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念
Java 类装载过程是Java虚拟机(JVM)运行的核心机制之一,主要涉及到类从加载到初始化的完整生命周期。这一过程确保了程序的正确运行,并在安全性方面起到关键作用。以下是详细的解释: 1)装载(Loading): 在这...
"Java卡的可信代码装载机制设计" 本文将详细介绍Java卡的可信代码装载机制设计,以满足可信计算平台(TCP)需求。该设计基于Java卡技术,采用代码签名技术作为主要手段,以卡内的安全域(Security Domain)作为各个...
Java虚拟机(JVM)的类装载机制是Java运行时环境的核心组成部分,它负责将类文件中的字节码加载到JVM中,使类成为JVM的一部分。类装载过程不仅涉及基本的类查找和导入,还包含了链接、验证、准备、解析和初始化等多...
在Java编程语言中,类装载器(ClassLoader)和命名空间是理解Java运行时环境的重要概念。它们共同确保了程序的正确性和安全性。类装载器负责将类文件加载到Java虚拟机(JVM)中,而命名空间则帮助组织和管理这些类,...
装载问题-分支限界算法-java实现 装载问题 装载问题是一种经典的组合优化问题,目的是在有限的容量内装载尽可能多的物品,以达到最大化总重量或总价值。装载问题有多种变种,包括0/1背包问题、分支限界问题、动态...
本篇文章将深入探讨Java类文件的动态装载机制,并结合源码分析其工作原理。 Java类的装载过程主要由类加载器(ClassLoader)来完成,这是一个关键组件,它负责查找、加载和初始化类。Java类加载器分为系统类加载器...
### Java深度历险(2)--深入类装载器 #### 前言 在现代软件开发领域,特别是使用Java这样的高级编程语言时,“动态性”是一个非常重要的概念。它指的是程序能够在运行时根据需要加载、卸载或替换部分代码的能力。这...
类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。
Java 类的动态装载机制是Java 虚拟机的一项核心技术,可以在运行时刻动态地加载或替换系统的 某些功能模块,而不影响系统其它功能模块的正常运行。介绍了Java 虚拟机中类的动态装载机制的原理、实现 及应用,分析了...
《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是...总之,深入理解JVM的类装载器原理,不仅有助于我们更好地理解和调试Java程序,也有助于我们在实际开发中实现更加高效和灵活的类管理机制。