`
mx19841031
  • 浏览: 74670 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

Java Class Loader

阅读更多

Java Class Loader的工作原理在宫力等人的《Inside Java 2 Platform Security》和Bill Venners的《Inside Java 2 Virturl Machine》里面有非常精彩的介绍。不过这个问题还是困惑了我一段时间,所以把心得小结如下。


JVM采用动态类型加载方式,所以概念上只有当一个类型被应用到时,虚拟机才会加载它。比如,假设类C引用了类D,只有当虚拟机执行到C中引用D的语句时才会去加载D。

Defining Class Loader 和 Initiating Class Loader

Defining class loader是指真正执行加载某个类的动作的那个类加载器实例。在虚拟机中,一个类型C是由其类型名和定义它的那个defining class loader来唯一标识的,即C=<N, L>。Iniating class loader是指发起这个加载动作的类加载器实例。比如在前面的例子中,虚拟机发现C引用D时,就把C的defining class loader作为D的initiating class loader。至于D最终是由谁定义的,则要由class loader的代理机制来决定。

常见Class Loader

文章和书籍中常常提到下面几种class loader:

  • Bootstrap class loader:虚拟机运行时必须要用到的类的加载器,比如java.*。它通常是在虚拟机种用本地代码(如C)实现,在系统中用null表示。
  • Extension class loader:负责加载Java环境中安装的可选包(optional package)中的类。
  • Application class loader:负责加载CLASSPATH上的类。有时候也称为system class loader,Java程序可以通过调用java.lang.getSystemClassLoader()获得它的引用。

层次关系

Class loader之间有两种层次关系:继承关系和代理(delegation)关系

除bootstrap class loader之外的所有其它class loader都是用Java语言来实现的,所以它们之间自然有继承关系。Java API里面定义的类的继承关系如下:java.net.URLClassLoader --> java.security.SecureClassLoader --> java.lang.ClassLoader --> java.lang.Object。

代理关系是class loader实例之间的动态关系。在创建一个class loader实例时可以给其构造函数传递一个parent参数,这样该parent就成了新创建的class loader在代理层次上的父节点。这个层次树的根节点就是bootstrap class loader实例。Java程序可以通过调用class loader实例的getParent()方法来获取其父节点。比如在JDK1.5中运行HelloWorld程序时class loader的代理继承关系如下:sun.misc.Launcher$AppClassLoader --> sun.misc.Launcher$ExtClassLoader --> null (bootstrap class loader)。

代理机制

当一个class loader收到加载某个类的请求时,它按照下面的流程处理:

  1. 查找这个类是不是已经被自己加载过,如果没有则进行下一步;
  2. 请求代理层次中的父加载器加载这个类;
  3. 如果父加载器无法加载这个类(抛回异常),则尝试自己加载这个类。如果能够加载,则定义该类,否则抛出异常。

所以在代理层次结构上的子节点永远只加载父节点(及其祖先节点)所不能加载的类,这样可以保证类始终被合适的class loader加载,比如rt.jar中的类永远被bootstrap class loader加载。

回到HelloWorld的例子。当虚拟机一开始加载HelloWorld类的时候,它的initiating class loader是application class loader,该类调用extension class loader,它又调用bootstrap class loader;bootstrap class loader(在rt.jar中)找不到HelloWorld类,抛出异常;extension class loader截获异常后开始试图自己加载,但是它(在扩展包内)也找不到HelloWorld,于是也抛出异常;application class loader截获这个异常,它在CLASSPATH中找到了HelloWorld于是加载并定义了这个类,所以HelloWorld类的defining class loader就是这个application class loader实例。

当HelloWorld引用到java.lang.System类时虚拟机开始加载System类。这时定义了HelloWorld类的application class loader就成了System类的iniating class loader。重复上述操作,但是这次bootstrap class loader找到了System类就定义了该类,后面的extension class loader和application class loader就不再试图加载了。所以java.lang.System类的defining class loader就是bootstrap class loader。

分享到:
评论
1 楼 ricoyu 2009-12-28  
很有帮助,受教了

相关推荐

    java class loader(JAVA类加载器)

    自己收集的java class loader相关的一些网络资源文档, 希望对大家有所帮助

    Java Class Loader总结.doc

    Java Class Loader总结

    java 类加载器 class loader

    java 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loader

    深入Class Loader

    深入 Java 的Class Loader(类加载器)

    class loader

    Dynamic class loading in the Java Virtual Machine

    深入java虚拟机(inside the java virtual machine)

    The Class Loader Architecture The Java Class File The Java API The Java Programming Language Architectural Tradeoffs Future Trends On the CD-ROM The Resources Page 2 Platform independence Why ...

    Java经典入门教程pdf完整版

    loader Byte code Verifier Javac Hello.java Netwo Hello class Interpreter code Runtime generator/ Hardware 1:编写代码 首先把我们想要计算机做的事情,通过Java表达出来,写成Java文件,这个过程就是 编写代码的...

    Class Loader:在没有命令提示符的情况下执行Java .class文件-开源

    Class Loader 是一个可视化的基本 .net 2.0 软件。 使用类加载器,您可以在没有命令提示符的情况下执行 .class 文件。 只需打开类文件!

    js-class-loader:(Java) 快速 Javascript 聚合器捆绑器,具有依赖项检测功能

    js 类加载器(Java) 一种免费软件工具,用于捆绑和提供具有内置依赖项检测功能的大型 Javascript 代码库。 请参阅网站 和 github 仓库: : 了解更多信息。

    JAVA白皮书(英文版)

    6.2Security Checks in the Class Loader 6.3The Byte Code Verification Process 6.3.1The Byte Code Verifier 6.4Security in the Java Networking Package 6.5Summary 7. Multithreading 7.1...

    深入解析Java中的Class Loader类加载器

    主要介绍了Java中的类加载器,是Java入门学习中的基础知识,需要的朋友可以参考下

    hive-jdbc-1.1.0-cdh5.4.5-standalone.jar

    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) at org.eclipse.osgi.internal....

    Java常用基础知识-kaic.docx

    你可以创建个新的class loader,然后用loadClass加载,再newInstance;原来加载的classloader是不能重新加载的;这算是一个典型的容器思路。 《深入理解java虚拟机》 2、对java“书写一次,到处运行”(Write once, ...

    hive-jdbc-2.1.0-standalone.jar

    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) at org.eclipse.osgi.internal....

    Java虚拟机 JVM 内存结构介绍

    描述Java虚拟机规范中关于内存管理的部分 主要介绍Runtime Data Area,包括Java Stack,Native Method Stack, ...还简要介绍了Runtime Data Area周边的模块,包括Class Loader,Execution Engine,Native Interface

    深入Java虚拟机读书笔记1

    Java虚拟机的基本结构图:Java虚拟机包含一个类装载器(class loader),可以从程序和API中装载class文件,其中API只有程序执行时需要的那

    jboss 5 原理 2 classloader

    With OSGi-style classloading getting more and more traction, and a number of new Java modules/classloading specifications on the horizon, it was high time we revamped our classloading layer in order ...

    javacv-platform-1.3.3-src

    The class definitions are basically ports to Java of the original header files in C/C++, and I deliberately decided to keep as much of the original syntax as possible. For example, here is a method ...

    commons-beanutils-1.7.0

    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325) at org.apache.catalina...

    深入探讨 Java 类加载器

    类加载器(class loader)是 Java™ 中的一个很重要的概念。类加载器负责加载 Java 类的字节代码到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载...

Global site tag (gtag.js) - Google Analytics