JAVA及类加载器及工作原理_第1页
JAVA及类加载器及工作原理_第2页
JAVA及类加载器及工作原理_第3页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JAVA及类加载器及工作原理类加载器的工作原理Java 类加载器的作用就是在运行时加载类。Java 类加载器基于三个机制:委托、可见性和 单一 性。委托机制是指将加载一个类的请求交给 父类加载 器,如果这个父类加载器不能够找到 或者加载这个类, 那么再加载它。可见性的原理 是子类的加载器可以看 见所有的父类加载器加 载的类,而父类加载器看不到 子类加载器加载 的类。单一性原理是指仅加载一个类 一次,这是 由委托机制确保子类加载器不会再次加载 父类 加载器加载过的类。正确理解类加载器能够帮你 解 决NoC1as sDefFoundError 和java, lang ? ClassNotFound

2、Exceptiom 因为它 们 和类的加载相关。类加载器通常也是比拟高级 的Java 面试中的重要考题, Java 类加载器和工 作原理 以及 classpath 如何运作的经常被问到。 Java 面试 题中也经常出现“一个类 是否能被两 个不同类加载 器加载这样的问题。这篇教程 中,我们将学到类加 载器是什么,它的工作原理 以及一些关于类加载器的 知识点。什么是类加载器类加载器是一个用来加载类文件的类。 Java 源 代码通过javac编译器编译成类文件。然后JVM来执 行类文件中的字节码来执行程序。类加 载器负责加载 文件系统、网络或其他来源的类 文件。有三种默认使 用的类加载器: Boo

3、tstrap 类加载器、 Extension 类 加 载 器 和 System 类 加 载 器 ( 或 者 叫 作 Application 类加载器)。每种 类加载器都有设定 好从哪里加载类。? Bootstrap 类加载器负责加载 rt. jar中的JDK类文件,它是所有类加载器的父加载器。 Bootstrap 类加载器没有任何父类加 载 器, 如果你调用St ring ? class ? get ClassLoader ()、会返回nul 任何基于此的代码会抛出 lN,U1IPointerException异常。 Bootstrap 加载器被称为初始类加载器。?而 Extension 将加

4、载类的请求先委托 给它的父加载器,也就是 Bootstrap, 如果 没有 成功加载的话,再从 jre/lib/ext 目录 下或者 java. ext. dirs 系统属性定义的目 录下加载 类。 Extension 加载器由 sun. misc ? Launcher$ExtClassLoader 实现。?第三种默认的加载器就是 System 类加 载 器(又叫作 Application 类加载器)了。 它负 责从 classpath 环境变量中加载某些应 用相关 的类, classpath 环境变量通常由 -classpath 或 -cp 命令行选项来定义,或者 是 JAR 中的 Mani

5、fest 的 classpath 属性。 Application 类加载器是 Extension 类加载 器的子加载器。 通过 sun. misc ? Launcher $ AppCl as sLoader 实现。除了 Bootstrap类加载器是大局部由C来写的, 其他的类加载器都是通过 java. lang. ClassLoader 来实现的。总结一下,下面是三种类加载器加载类文件 的地 方:1) Bootstrap 类加载器 - JRE/lib/rt. jar2) Extension 类加载器 - JRE/lib/ext 或 者 java. ext. dirs 指向的目录3) Appli

6、cation 类加载器-CLASSPAT环境变 量,由-classpath 或-cp选项定义,或者是JAR 中的Maidfest的classpath属性定义.类加载器的工作原理我之前已经提到过了,类加载器的工作原理基于三个机制:委托、可见性和单一性。这一节 ,我 们来详细看看这些规那么,并用一个实例来理解 工作原 理。下面显示的是类加载器使用委托机制 的工作原理。委托机制 当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。假设你有一个应用需要的类叫作Abe. class,首先加载这个类的请求由Application类加载器委托给它的父类加载器Extension类加载器,然后再委托给 B

7、ootstrap 类 加载器。Bootstrap类加载器会先看看rt. jar 中 有没有这个类,因为并没有这个类,所以这个请求由回到 Extension类加载器,它会 查看jre/lib/ext目录下有没有这 个类,如果 这个类被Extension类加载器找到了,那么它将被加载, 而Application 类加载器不会加载这个类;而如果 这个类没有被Extension类加载器找到,那么再由 Application类加载器从classpath 中寻找。记住classpath 定义的是类文件的加载目录,而 PATH是定义的是可执行程 序如 javac, java等的执行路径。诃呛He Xim帖可

8、见性机制根据可见性机制, 子类加载器可以看到父类 加载 器加载的类,而反之那么不行。所以下面的例 子中,当 Abe. class 已经被 Application 类加载 器加载过 了 , 然后如果想要使用 Extension 类加 载器加载这个 类 , 将 会 抛 出 java. lang. ClassNotFoundException 异常。Ipackage test;import java ? import java ? Logger;util, utillogging ? Level;? logging ?qHo w cV/*Javatoprogram demonstra/te Clas

9、sLoader works in Java, * in particular about visibility principle of ClassLoader ?* author Javin Paul*/public classClassLoaderTest sta public tic llmain (String args) try/printi ng classSystem. o ut? pri ntln ("ClassLoaderTes t? get Class () ? g etClassLoader ():"+ClassLoaderTest ? class g

10、etClassLoader()2Extension class loader1 /trying to explicitly load this class again usingClass ? forName("test. ClassLoaderTest", trueClassLoaderTest ? class ? getClassLoader () ? getParent();ca/tch(ClassNotFoundException ex) Logger? g etLogger(C1assLoaderTest ? class ? getName() ).log (Le

11、vel. SEVERE, null, ex);输出:ClassLoaderTest ? getClass()getClassLoad1er ():2sun. misc? Launcher$AppClassLoader60lbb13 16/08/20212:43:48AM4 test. ClassLoaderTest main5 SEVERE: null6 java ? lang ? ClassNotFoundException: test.7 ClassLoaderTest 89 java ? net. URLClassLoader$l ?1 run(URLClassL oader ? jav

12、a:202)atat0java ? security. AccessController doPrivil eged(Native Method)at11java ? net. URLClassLoader ?2 findClass(URLCI assLoader ? java:190)at1sun. misc? Launcher$ExtClassLoader. findCl ass (Launcher ? java:229)单一性机制根据这个机制,父加载器加载过的类不能被子加载器加载第二次。虽然重写违反委托和单一性机制的类加 载器是可能的,但这样做并不可取。你写自己的类加载器的时候应该严格遵

13、守这三条机制。Java 提供了显式加载类的 API : Class ? forName (classname) 和 Class ? forName(classname, initialized, classloader) o 就像上面的例子中,你可以指定 类 加载器的名称以及要加载的类的名称。类的加 载是通 过调用 java. lang. ClassLoader 的 loadClass () 方法,而 loadClass() 方法那么调用 了 findClassO 方 法 来 定 位 相 应 类 的 字 节 码 。 在 这 个 例 子 中 Extension 类 加 载 器 使 用 了 jav

14、a. net. URLClassLoader, 它从 JAR 和目录中 进行査找类文 件,所有以 / 结尾的査找路径 被认为是目录。如 果 findClass0 没有找到那么 它会抛出 java. lang. ClassNotFoundException 异常,而如果找到的话那么 会调用 defineClassO 将字节码转化成类实例,然后 返回。什么地方使用类加载器类加载器是个很强大的概念,很多地方被运 用。 最经典的例子就是 AppletClassLoader, 它 被用来 加载 Applet 使用的类, 而 Applets 大部 分是在网上 使用,而非本地的操作系统使用。使 用不同的类加载器,你可以从不同的源地址加载同一个类,它们被视

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论