`
seeglow
  • 浏览: 54411 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

了解ClassLoader

    博客分类:
  • JAVA
阅读更多

了解ClassLoader
1, 什么是 ClassLoader? 
Java 程序并不是一个可执行文件,是需要的时候,才把装载到 JVM中。ClassLoader 做的工作就是 JVM 中将类装入内存。 而且,Java ClassLoader 就是用 Java 语言编写的。这意味着您可以创建自己的 ClassLoader 
ClassLoader 的基本目标是对类的请求提供服务。当 JVM 需要使用类时,它根据名称向 ClassLoader 请求这个类,然后 ClassLoader 试图返回一个表示这个类的 Class 对象。 通过覆盖对应于这个过程不同阶段的方法,可以创建定制的 ClassLoader。
2, 一些重要的方法
A) 方法 loadClass 
ClassLoader.loadClass() 是 ClassLoader 的入口点。该方法的定义如下: 
Class loadClass( String name, boolean resolve );
name JVM 需要的类的名称,如 Foo 或 java.lang.Object。
resolve 参数告诉方法是否需要解析类。在准备执行类之前,应考虑类解析。并不总是需要解析。如果 JVM 只需要知道该类是否存在或找出该类的超类,那么就不需要解析。 

B) 方法 defineClass 
defineClass 方法是 ClassLoader 的主要诀窍。该方法接受由原始字节组成的数组并把它转换成 Class 对象。原始数组包含如从文件系统或网络装入的数据。defineClass 管理 JVM 的许多复杂、神秘和倚赖于实现的方面 -- 它把字节码分析成运行时数据结构、校验有效性等等。不必担心,您无需亲自编写它。事实上,即使您想要这么做也不能覆盖它,因为它已被标记成final的。 

C) 方法 findSystemClass 
findSystemClass 方法从本地文件系统装入文件。它在本地文件系统中寻找类文件,如果存在,就使用 defineClass 将原始字节转换成 Class 对象,以将该文件转换成类。当运行 Java 应用程序时,这是 JVM 正常装入类的缺省机制。(Java 2 中 ClassLoader 的变动提供了关于 Java 版本 1.2 这个过程变动的详细信息。) 对于定制的 ClassLoader,只有在尝试其它方法装入类之后,再使用 findSystemClass。原因很简单:ClassLoader 是负责执行装入类的特殊步骤,不是负责所有类。例如,即使 ClassLoader 从远程的 Web 站点装入了某些类,仍然需要在本地机器上装入大量的基本 Java 库。而这些类不是我们所关心的,所以要 JVM 以缺省方式装入它们:从本地文件系统。这就是 findSystemClass 的用途。 

D) 方法 resolveClass 
正如前面所提到的,可以不完全地(不带解析)装入类,也可以完全地(带解析)装入类。当编写我们自己的 loadClass 时,可以调用 resolveClass,这取决于 loadClass 的 resolve 参数的值。 


E) 方法 findLoadedClass 
findLoadedClass 充当一个缓存:当请求 loadClass 装入类时,它调用该方法来查看 ClassLoader 是否已装入这个类,这样可以避免重新装入已存在类所造成的麻烦。应首先调用该方法。

3, 怎么组装这些方法 
1) 调用 findLoadedClass 来查看是否存在已装入的类。
2) 如果没有,那么采用那种特殊的神奇方式来获取原始字节。
3) 如果已有原始字节,调用 defineClass 将它们转换成 Class 对象。
4) 如果没有原始字节,然后调用 findSystemClass 查看是否从本地文件系统获取类。
5) 如果 resolve 参数是 true,那么调用 resolveClass 解析 Class 对象。
6) 如果还没有类,返回 ClassNotFoundException。

4,Java 2 中 ClassLoader 的变动
1)loadClass 的缺省实现 
定制编写的 loadClass 方法一般尝试几种方式来装入所请求的类,如果您编写许多类,会发现一次次地在相同的、很复杂的方法上编写变量。 在 Java 1.2 中 loadClass 的实现嵌入了大多数查找类的一般方法,并使您通过覆盖 findClass 方法来定制它,在适当的时候 findClass 会调用 loadClass。 这种方式的好处是您可能不一定要覆盖 loadClass;只要覆盖 findClass 就行了,这减少了工作量。 

2)新方法:findClass
loadClass 的缺省实现调用这个新方法。findClass 的用途包含您的 ClassLoader 的所有特殊代码,而无需要复制其它代码(例如,当专门的方法失败时,调用系统 ClassLoader)。 

3) 新方法:getSystemClassLoader 
如果覆盖 findClass 或 loadClass,getSystemClassLoader 使您能以实际 ClassLoader 对象来访问系统 ClassLoader(而不是固定的从 findSystemClass 调用它)。 

4) 新方法:getParent 
为了将类请求委托给父代 ClassLoader,这个新方法允许 ClassLoader 获取它的父代 ClassLoader。当使用特殊方法,定制的 ClassLoader 不能找到类时,可以使用这种方法。
父代 ClassLoader 被定义成创建该 ClassLoader 所包含代码的对象的 ClassLoader。

分享到:
评论

相关推荐

    classloader

    首先,让我们深入了解ClassLoader的基本概念。在传统编程语言中,如C或C++,程序通常是一个单一的可执行文件,而Java则不同,它的编译结果是以平台无关的类文件格式存在。每个类文件对应于一个单独的Java类,且这些...

    深入理解ClassLoader工作机制.docx

    了解ClassLoader的工作机制对于优化程序性能、处理类冲突以及实现安全的插件系统至关重要。开发者可以根据需求定制ClassLoader,以满足特定的加载需求,如加载动态生成的类或处理版本兼容问题。总的来说,深入理解...

    理解Java ClassLoader机制

    同时,当遇到“双亲委派模型”(Parent Delegation Model)引发的问题,如类加载异常时,了解ClassLoader的运作方式可以更快定位和解决问题。 总的来说,Java ClassLoader机制是Java平台的核心特性之一,它使得程序...

    ClassLoader 案例

    首先,了解ClassLoader的工作原理。Java中的类加载过程分为三个阶段:加载、验证、准备、解析和初始化。默认情况下,系统使用Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader来加载不同路径下的类。...

    ClassLoader原理

    这篇博文将带你深入了解ClassLoader的工作机制。 首先,我们来理解ClassLoader的基本概念。ClassLoader是一个抽象的概念,它是Java中的一个接口,位于`java.lang.ClassLoader`包下。它的主要职责是找到类的二进制...

    ClassLoader总结

    了解ClassLoader的工作机制对于深入理解Java应用程序的运行过程至关重要,它可以帮助开发者解决一些复杂的加载问题,比如类冲突、类版本控制等。此外,熟悉ClassLoader还能提升对Java安全模型的理解,因为类加载与...

    测试普通Java程序ClassLoader等级关系的Demo程序

    首先,我们要了解ClassLoader的基本概念。在Java中,ClassLoader是一个系统组件,它根据指定的全限定类名(包括包名和类名)找到对应的.class文件,并将其转换为运行时的Class对象。Java的类加载机制遵循“双亲委派...

    java中ClassLoader

    Java 中的 ClassLoader Java 中的 ClassLoader 是一个非常重要的组件,它负责动态加载 class 文件到虚拟机...通过了解 ClassLoader 的工作机制,我们可以更好地理解 Java 应用程序的加载过程,并提高我们的开发效率。

    深入java虚拟机(七)深入源码看java类加载器ClassLoader 1

    了解ClassLoader的内部实现对于优化应用程序性能、实现定制的类加载策略、理解和解决类加载问题至关重要。例如,自定义类加载器可以用于实现热部署、类隔离、加密加载等高级功能。 总的来说,ClassLoader是Java平台...

    Java ClassLoader

    本教程概述了 Java ClassLoader,并指导您构造在装入代码之前自动编译代码的示例 ClassLoader。您将完全了解 ClassLoader 的功能以及创建自己的 ClassLoader 需要执行的操作

    ClassLoader

    通过对`ClassLoader`的基本概念、工作原理、双亲委托机制以及不同类型的类加载器的了解,我们可以更好地理解Java类加载的过程及其背后的设计哲学。这对于深入理解Java虚拟机的内部机制以及开发高质量的应用程序都至...

    ClassLoader小例子

    了解和掌握ClassLoader的概念及其应用,对于理解和调试复杂的Java应用程序,尤其是涉及到动态加载和插件化开发的场景,是非常有帮助的。通过深入研究"ClassLoader小例子",你可以更好地理解Java的类加载机制,并为...

    JVM ClassLoader简析

    在Java世界中,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码并执行程序。ClassLoader是JVM中的一...阅读"ClassLoader简析.pdf"文档和分析"Sample.zip"中的代码,将有助于形成更全面的了解。

    JAVA工程师实习一周总结【推荐下载】.doc

    了解ClassLoader机制后,我发现自定义类加载器是一项重要的技能。在某些场景下,比如需要从网络上动态加载类或者加载非标准路径的类库时,JVM默认的类加载器就无法满足需求。自定义类加载器允许我们扩展加载类的能力...

    ClassLoader的 一些测试

    1. 源码分析:研究ClassLoader的源码,了解其内部实现,特别是加载类的逻辑。 2. 类加载顺序:观察不同类加载器加载类的顺序,验证双亲委派模型。 3. 动态加载:创建自己的类加载器,尝试动态加载新的类,实现代码的...

    android 内存泄露 分析方法

    首先,让我们了解 ClassLoader 的工作原理。ClassLoader 的本质是把磁盘上的类文件读入内存,然后调用 java.lang.ClassLoader.defineClass 方法告诉系统把内存镜像处理成合法的字节码。Java 提供了抽象类 ...

    java 类加载器 class loader

    了解ClassLoader的工作机制对于优化应用性能、实现安全控制以及进行插件化开发至关重要。 首先,Java的ClassLoader主要分为四种类型: 1. 启动类加载器(Bootstrap ClassLoader):它是JVM的一部分,由C++实现,...

    了解Java ClassLoader

    了解Java ClassLoader不仅有助于理解JVM的运作机制,还能帮助开发者解决一些特定场景下的问题,比如实现模块化的类加载、动态加载代码、隔离不同版本的库等。因此,它是Java程序员必备的知识点之一。

Global site tag (gtag.js) - Google Analytics