Java的类载入器

每次创建Java类的实例时,都必须现将类载入到内存中。Java虚拟机使用类载入器来载入需要的类。一般情况下,类在如期会在一些Java核心类库,以及环境变量CLASSPATH中指明的目录中搜索相关类。如果在这些位置它都找不到要载入的类,就会抛出java.lang.ClassNotFoundException异常。

从J2SE 1.2开始,JVM使用了3中类载入器来载入所需要的类,分别是引导类载入器(bootstrap class loader)、扩展类载入器(extension class loader)和系统类载入器(system class loader)。3种类载入器之间是父子继承关系,其中引导类载入器位于层次结构的最上层,系统类载入器位于最下层。

引导类载入器用于引导启动JVM。当调用javax.exe程序时,就会启动引导类载入器。引导类载入器是使用本地代码来实现的,因为用它来载入运行JVM所需要的类,以及所有的Java核心类,例如java.lang包和java.io包下的类。启动类载入器会在rt.jar和i18n.jar等Java包中搜索要载入的类。引导类载入器要从哪些库中搜索类依赖于JVM和操作系统的版本。

扩展类载入器负责载入标准扩展目录中的类。这有利于程序开发,因为程序员值需要将JAR文件复制到扩展目录中就可以被类载入器搜索到。扩展类库依赖于JDK供应商的具体实现。SUN公司的JVM的标准扩展目录是/jdk/jre/lib/ext。

系统类载入器是默认的类载入器,它会搜索在环境变量CLASSPATH中指明的路径和JAR文件。

那么,JVM使用的是哪个类载入器呢?答案在于类载入器的代理模型。使用代理模型可以有效地解决类载入过程中的安全性问题。每当需要载入一个类的时候,会首先调用系统类载入器。但是,它并不会立即载入某个类。相反,它会将载入类的任务交给其父载入器,即扩展类载入器,而扩展类载入器又会将载入任务交给其父类载入器,即引导类载入器。因此,引导类载入器总是会首先执行载入某个类的任务。如果引导类载入器找不到需要载入的类,那么扩展类载入器会尝试载入该类。如果扩展类载入器也找不到这个类,就会轮到系统类载入器继续执行载入任务。如果系统类载入器还是找不到这个类,则会抛出java.lang.ClassNotFoundException异常。那么为什么要执行这样也给循环过程呢?

代理模型的重要用途就是为了解决类载入过程中的安全性问题。如你所知,可以使用安全管理器来限制某个类对某个路径的访问。现在,某个恶意用户编写了一个名为java.lang.Object的类,它可以访问硬盘中的任意目录。由于JVM是信任java.lang.Object类的,这样,它就不会监视这个类的活动。结果是,如果这个自定义java.lang.Object允许载入,安全管理器就这样被轻易的绕过了。幸运的是,由于使用了代理模型,这种情况是不会发生的。

当程序中的某个地方调用了自定义的java.lang.Object类时,系统类载入器会将载入任务委托给扩展类载入器,继而会被交给引导类载入器。引导类载入器搜索器核心库,找到标准的java.lang.Object类,并将之实例化。结果是,自定义java.lang.Object类并没有载入。

关于Java中类载入机制的一件重要的事情是,可以通过继承抽象类java.lang.ClassLoader类编写自己的类载入器。

使用自定义的类载入器可以实现如下的需求:

1.在载入类中指定某些规则

2.缓存已将载入的类

3.实现类的预载入,方便使用

Java的类载入器

时间: 2024-08-27 11:31:15

Java的类载入器的相关文章

Java类载入器 ClassLoader的解析

//參考 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类载入器基本概念 类载入器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之中的一个.它使得 Java 类能够被动态载入到 Java 虚拟机中并运行. 类载入器从 JDK 1.0 就出现了.最初是为了满足 Java Applet 的须要而开发出来的.Java Applet 须要从远程下载 Java 类文件到浏览器中并运行.如今类载入器在 Web 容

Java类载入器(一)——类载入器层次与模型

类载入器 ??虚拟机设计团队把类载入阶段中的"通过一个类的全限定名来获取描写叙述此类的二进制字节流"这个动作放到Java虚拟机外部去实现.以便让应用程序自己决定怎样去获取所须要的类.实现这个动作的代码模块称为"类载入器". 类载入器层次(等级) ??从JVM的角度来讲,仅仅存在两种不同的类载入器. ??第一类是启动类载入器(Bootstrap ClassLoader):这个类载入器主要载入JVM自身工作须要的类.这个类载入器由C++语言实现(特指HotSpot).是

java类载入器——ClassLoader

Java的设计初衷是主要面向嵌入式领域,对于自己定义的一些类,考虑使用依需求载入原则.即在程序使用到时才载入类,节省内存消耗,这时就可以通过类载入器来动态载入. 假设你平时仅仅是做web开发,那应该非常少会跟类载入器打交道,但假设你想深入学习tomcatserver的架构,它是不可缺少的.所谓类载入器.就是用于载入Java类到Java虚拟机中,它负责读取Java字节码.并转换成java.lang.Class类的一个实例.使字节代码.class文件得以执行. 一般类载入器负责依据一个指定的类找到相

finalkeyword对JVM类载入器的影响

众所周知,当訪问一个类的变量或方法的时候.假设没有初始化该类.就会先去初始化一个类 可是,当这个类的变量为final的时候,就不一定了 请看以下的样例 package com.lala.shop; import java.util.Random; public class App { public static void main(String[] args) { System.out.println(User.c); } } class User { public static final i

tomcat(8)载入器

[0]README 0.0)本文部分描述转自"深入剖析tomcat",旨在学习 tomcat(8)载入器 的基础知识: 0.1)一个标准web 应用程序中的载入器:简单来说就是 tomcat中的载入器: 0.2)servlet容器需要实现一个自定义的载入器,而不能简单地使用系统的类载入器的原因:(干货--为什么servlet容器要实现一个自定义的载入器) 0.2.1)原因1:因为servlet容器不应该完全信任它正在运行的servlet类: 0.2.2)原因2:如果使用系统类的载入器载

How Tomcat Works 读书笔记 八 载入器

Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf123321/article/details/40431297 首先说明两个术语 仓库(repository),表示类加载器会在哪里搜索要载入的类; 资源(resource),知道一个类载入器中的DirContext对象,它的文件跟路径指的就是上下文的文件跟路径. 在tomcat中,我们使用了自定义载入器,

Java虚拟机的类载入机制

Java虚拟机类载入过程是把Class类文件载入到内存.并对Class文件里的数据进行校验.转换解析和初始化,终于形成能够被虚拟机直接使用的java类型的过程. 在载入阶段,java虚拟机须要完毕下面3件事: a.通过一个类的全限定名来获取定义此类的二进制字节流. b.将定义类的二进制字节流所代表的静态存储结构转换为方法区的执行时数据结构. c.在java堆中生成一个代表该类的java.lang.Class对象,作为方法区数据的訪问入口. Java虚拟机的类载入是通过类载入器实现的, Java中

[读书笔记]Java类载入过程

一. 类的生命周期 类从被载入到虚拟机内存中開始,到卸载出内存为止,有下面(如图)的生命周期: 以上"载入->验证->准备->解析->初始化"称为类的载入过程. Java虚拟机规范中没有对什么时候须要開始类载入的第一阶段进行强制约束,而是交给了虚拟机依据详细实现来自由把握. 可是对于初始化阶段,虚拟机有下面5种必须对类立即进行"初始化"的情况: (1)遇到new.getstatic.putstatic或invokestatic这4条字节码指令

WorldWind源码剖析系列:配置载入器类ConfigurationLoader

配置载入器类ConfigurationLoader主要从指定的路径中加载保存星球相关参数的xml文件,从中读取数据来构造星球对象及其所关联的可渲染子对象列表并返回.该类的类图如下所示. 该类所包含的主要的方法基本都是静态的,功能说明如下: public static double ParseDouble(string s)将字符串s解析为Double型数字 private static bool ParseBool(string booleanString) 将字符串s解析为bool型 publ