了解ClassLoader
--------------------------------------------------------------------------------
摘要:Java 的ClassLoder是java 中一个神奇的东西,弄清楚java是怎么装载类的,会对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的基本概念。在传统编程语言中,如C或C++,程序通常是一个单一的可执行文件,而Java则不同,它的编译结果是以平台无关的类文件格式存在。每个类文件对应于一个单独的Java类,且这些...
了解ClassLoader的工作机制对于优化程序性能、处理类冲突以及实现安全的插件系统至关重要。开发者可以根据需求定制ClassLoader,以满足特定的加载需求,如加载动态生成的类或处理版本兼容问题。总的来说,深入理解...
了解和掌握ClassLoader的概念及其应用,对于理解和调试复杂的Java应用程序,尤其是涉及到动态加载和插件化开发的场景,是非常有帮助的。通过深入研究"ClassLoader小例子",你可以更好地理解Java的类加载机制,并为...
同时,当遇到“双亲委派模型”(Parent Delegation Model)引发的问题,如类加载异常时,了解ClassLoader的运作方式可以更快定位和解决问题。 总的来说,Java ClassLoader机制是Java平台的核心特性之一,它使得程序...
首先,了解ClassLoader的工作原理。Java中的类加载过程分为三个阶段:加载、验证、准备、解析和初始化。默认情况下,系统使用Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader来加载不同路径下的类。...
在Java世界中,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码并执行程序。ClassLoader是JVM中的一...阅读"ClassLoader简析.pdf"文档和分析"Sample.zip"中的代码,将有助于形成更全面的了解。
这篇博文将带你深入了解ClassLoader的工作机制。 首先,我们来理解ClassLoader的基本概念。ClassLoader是一个抽象的概念,它是Java中的一个接口,位于`java.lang.ClassLoader`包下。它的主要职责是找到类的二进制...
1. 源码分析:研究ClassLoader的源码,了解其内部实现,特别是加载类的逻辑。 2. 类加载顺序:观察不同类加载器加载类的顺序,验证双亲委派模型。 3. 动态加载:创建自己的类加载器,尝试动态加载新的类,实现代码的...
了解Java ClassLoader不仅有助于理解JVM的运作机制,还能帮助开发者解决一些特定场景下的问题,比如实现模块化的类加载、动态加载代码、隔离不同版本的库等。因此,它是Java程序员必备的知识点之一。
最后,了解`ClassLoader`的工作原理对于理解和解决一些特定问题非常有用,例如处理类加载冲突、实现模块化系统或是提高安全性。同时,掌握加密解密和反编译防御技术对于开发安全的Java应用至关重要。 总结来说,`...
首先,让我们深入了解Java的ClassLoader。ClassLoader是一个抽象类,它是Java中的一个关键组件,实现了JVM规范定义的加载类的功能。类加载过程通常分为三个阶段:加载、验证、准备。加载阶段,ClassLoader根据类名...
### Java ClassLoader 知识点解析 #### 一、引言 在《classloader教程 --- from ...总之,《classloader教程 --- from IBM》是一篇非常全面且实用的教程,对于希望深入了解Java类加载机制的开发者来说,绝对值得一读。
通过这个项目,开发者不仅可以深入了解Java虚拟机的工作原理,还能掌握如何定制类加载器以满足特定场景的需求,提升系统的灵活性和可维护性。对于想要深入Java底层机制的开发者来说,这是一个不可多得的学习资源。
了解ClassLoader的工作机制对于深入理解Java应用程序的运行过程至关重要,它可以帮助开发者解决一些复杂的加载问题,比如类冲突、类版本控制等。此外,熟悉ClassLoader还能提升对Java安全模型的理解,因为类加载与...
Java 中的 ClassLoader Java 中的 ClassLoader 是一个非常重要的组件,它负责动态加载 class 文件到虚拟机...通过了解 ClassLoader 的工作机制,我们可以更好地理解 Java 应用程序的加载过程,并提高我们的开发效率。
通过本文的学习,我们不仅深入了解了Java类加载器的工作原理,还通过具体的自定义类加载器实例掌握了如何在实践中应用这些理论知识。类加载器在Java开发中扮演着极其重要的角色,尤其是在需要实现动态加载类的应用...
首先,我们要了解ClassLoader的基本概念。在Java中,ClassLoader是一个系统组件,它根据指定的全限定类名(包括包名和类名)找到对应的.class文件,并将其转换为运行时的Class对象。Java的类加载机制遵循“双亲委派...
通过理解其源码,我们可以更深入地了解Tomcat的工作方式,从而优化应用性能,解决类加载相关的复杂问题。对于开发者而言,这是一次宝贵的深入学习Java和Tomcat底层机制的机会。通过阅读和分析源码,我们可以不断提升...