`

Java类装载机制要义(转)

 
阅读更多


基本原理

所有类都由类装载器载入,载入内存中的类对应一个 java.lang.Class 实例。

已被加载的类由该类的类加载器实例与该类的全路径名的组合标识。设有 packagename.A Class ,分别被类加载器 CL1 和 CL2 加载,则系统中有两个不同的 java.lang.Class 实例: <CL1, packagename.A> 和 <CL2, packagename.A> 。

存在一个 Bootstrap Loader (以下简称为 BL ),由 C++ 写成,负责在虚拟机启动后一次

性加载 Java 基础类库中的所有类。其他的类装载器由 Java 写成,都是 java.lang.ClassLoader 的子类。

除 BL 之外的所有类装载器都有一个 parent 属性,指向其父装载器。查阅 java.lang.ClassLoader 的源码,不难发现类装载器的委托装载方式。

     protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException

    {

          // First, check if the class has already been loaded

          Class c = findLoadedClass(name);

          if (c == null ) {

              try {

                   if ( parent != null ) {

                       c = parent .loadClass(name, false );

                   } else {

                       c = findBootstrapClass0(name);

                   }

              } catch (ClassNotFoundException e) {

                  // If still not found, then invoke findClass in order

                  // to find the class.

                  c = findClass(name);

              }

          }

          if (resolve) {

              resolveClass(c);

          }

          return c;

    }

       对于给定的类名,首先检查自己是否已加载过该类。如果没有,则首先通过父装载器加载(如果 parent==null ,则直接通过 BL 来加载,相当于 BL 是其父装载器)。如果父装载器也无法装载,才真正调用自己的 findClass() 方法来装载。

       Java 基础类在 Java 虚拟机启动后由 BL 一次性载入。构成 Java 应用程序的其它类在程序运行过程中由不同类装载器按需通过 loadClass() 方法装载。
Java 程序启动过程中的类装载器

当执行“ java XXX.class ”时, java.exe 首先找到 JRE ( Java Runtime Environment ),接着找到位于 JRE 之中的 jvm.dll ,最后载入 jvm.dll 并启动虚拟机。

虚拟机一启动,先做一些初始化动作,如获取系统参数等,然后产生 BL 。 BL 加载 Java 基础类,这些类都存放在 JRE 中的 lib 目录下,可由 System.getProperty(“sun.boot.class.path”) 列出,如:

C:\Program Files\Java\jre1.5.0_09\lib\rt.jar;

C:\Program Files\Java\jre1.5.0_09\lib\i18n.jar;

C:\Program Files\Java\jre1.5.0_09\lib\sunrsasign.jar;

C:\Program Files\Java\jre1.5.0_09\lib\jsse.jar;

C:\Program Files\Java\jre1.5.0_09\lib\jce.jar;

C:\Program Files\Java\jre1.5.0_09\lib\charsets.jar;

C:\Program Files\Java\jre1.5.0_09\classes

       BL 然后创建 sun.misc.Launcher$ExtClassLoader ( ExtClassLoader 是定义于 sun.misc.Launcher 之内的内部类,继承自 java.lang.URLClassLoader )的实例(以下简称 EL )和 sun.misc.Launcher$AppClassLoader ( AppClassLoader 是定义于 sun.misc.Launcher 之内的内部类,继承自 URLClassLoader )的实例(以下简称 AL ),并将 EL 的 parent 属性设置为 null , AL 的 parent 属性设置为 EL 。

       EL 在程序运行过程中按需加载保存在 JRE 的“ \lib\ext ”目录下的类。该目录可由 System.getProperty(“java.ext.dirs”) 读出,如

C:\Program Files\Java\jre1.5.0_09\lib\ext

       AL 在程序运行过程中按需加载的类搜索路径则是从系统参数 java.class.path 取出的字符串。 java.class.path 是由我们在执行 java.exe 时,利用 -cp 或 -classpath 或 CLASSPATH 环境变量所决定。我们应用程序用到的非 JRE 提供类的搜索路径一般都配置在 java.class.path 中。
什么时候装载类,由什么类装载器装载

1.  Java 基础类由 BL 在虚拟机启动时一次性载入。

2.  包含 main() 的入口类由 AL 的 loadClass() 方法载入。

3.  由 new 关键字创建一个类的实例。该类由运行时刻包含该 new 语句的类实例的类装载器( ClassLoader.getCallerClassLoader() )的 loadClass() 方法载入。

4.  调用 Class.forName() 方法。完整的 forName() 函数版本有一个 ClassLoader 参数,用于指定用什么类装载器来装载指定类。

    public static Class<?> forName(String name, boolean initialize,

                 ClassLoader loader) throws ClassNotFoundException

       对于 public static Class<?> forName(String className) 版本,是由运行时刻包含该语句的类实例的类装载器( ClassLoader.getCallerClassLoader() )的 loadClass() 方法载入。

5.  调用某个 ClassLoader 实例的 loadClass() 方法。通过该 ClassLoader 实例的 loadClass() 方法载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。

6 .装载一个类时,首先要装载该类的基类及其接口。

分享到:
评论

相关推荐

    Java虚拟机类装载机制

    Java虚拟机类装载机制是Java运行环境中的核心组成部分,它负责将类的字节码从磁盘、网络等不同来源加载到JVM中,并进行一系列处理以使类能够被正确地使用。类装载机制的目的是为了实现代码的动态加载和运行时的灵活...

    java类装载

    java类装载介绍,介绍了java装载类的先后顺序

    JAVA虚拟机的类装载机制的原理分析与应用研究.pdf

    Java虚拟机(JVM)是Java程序运行的核心,它的类装载机制是理解Java应用程序如何启动、运行和管理的关键。本文将深入探讨Java虚拟机的类装载机制,包括其原理、工作流程以及在实际开发中的应用。 类装载机制是Java...

    Java虚拟机类装载:原理、实现与应用

    Java虚拟机类装载机制是Java运行环境的核心技术之一,它允许程序在运行时动态加载和使用类,极大地增强了软件的灵活性和可扩展性。本文主要探讨了类装载的原理、实现方式及其在实际应用中的作用。 首先,类装载的...

    Java虚拟机类装载的原理及实现

    所有JVM都内置了一个特殊的类装载器——根装载器(Bootstrap ClassLoader),它负责装载Java核心类库。当需要装载非设计时已知的类时,则需要使用用户自定义的类装载器。 #### 实例演示 以下是一个简单的示例,...

    [浅析J2EE应用服务器的JAVA类装载器]python回朔异常的模块.docx

    Java类装载器机制是Java语言灵活性的关键组成部分,尤其在J2EE应用服务器中扮演着重要角色。理解这一机制有助于开发者更好地部署和管理应用程序,解决可能出现的部署问题。 Java类装载器是Java虚拟机(JVM)的一...

    Java虚拟机类装载.doc

    Java虚拟机类装载 Java虚拟机(JVM)的类装载是指将包含在类文件中的字节码装载到JVM中...了解了JVM中的类装载机制和ClassLoader的工作原理,可以更好地理解Java虚拟机的工作机制,并更好地使用Java语言开发应用程序。

    java类装载器学习一、类加载器的基本概念

    类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念

    Java类装载过程_.docx

    Java 类装载过程是Java虚拟机(JVM)运行的核心机制之一,主要涉及到类从加载到初始化的完整生命周期。这一过程确保了程序的正确运行,并在安全性方面起到关键作用。以下是详细的解释: 1)装载(Loading): 在这...

    Java卡的可信代码装载机制设计.pdf

    "Java卡的可信代码装载机制设计" 本文将详细介绍Java卡的可信代码装载机制设计,以满足可信计算平台(TCP)需求。该设计基于Java卡技术,采用代码签名技术作为主要手段,以卡内的安全域(Security Domain)作为各个...

    Java虚拟机类装载:原理、实现与应用.doc

    Java虚拟机(JVM)的类装载机制是Java运行时环境的核心组成部分,它负责将类文件中的字节码加载到JVM中,使类成为JVM的一部分。类装载过程不仅涉及基本的类查找和导入,还包含了链接、验证、准备、解析和初始化等多...

    Java的类装载器和命名空间

    在Java编程语言中,类装载器(ClassLoader)和命名空间是理解Java运行时环境的重要概念。它们共同确保了程序的正确性和安全性。类装载器负责将类文件加载到Java虚拟机(JVM)中,而命名空间则帮助组织和管理这些类,...

    装载问题-分支限界算法-java实现

    装载问题-分支限界算法-java实现 装载问题 装载问题是一种经典的组合优化问题,目的是在有限的容量内装载尽可能多的物品,以达到最大化总重量或总价值。装载问题有多种变种,包括0/1背包问题、分支限界问题、动态...

    Java类文件动态装载

    本篇文章将深入探讨Java类文件的动态装载机制,并结合源码分析其工作原理。 Java类的装载过程主要由类加载器(ClassLoader)来完成,这是一个关键组件,它负责查找、加载和初始化类。Java类加载器分为系统类加载器...

    Java深度历险(2)--深入类装载器

    ### Java深度历险(2)--深入类装载器 #### 前言 在现代软件开发领域,特别是使用Java这样的高级编程语言时,“动态性”是一个非常重要的概念。它指的是程序能够在运行时根据需要加载、卸载或替换部分代码的能力。这...

    java类加载器实例

    类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。

    深入研究Java 的类加载机制

    Java 类的动态装载机制是Java 虚拟机的一项核心技术,可以在运行时刻动态地加载或替换系统的 某些功能模块,而不影响系统其它功能模块的正常运行。介绍了Java 虚拟机中类的动态装载机制的原理、实现 及应用,分析了...

    jvm类装载器原理

    《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是...总之,深入理解JVM的类装载器原理,不仅有助于我们更好地理解和调试Java程序,也有助于我们在实际开发中实现更加高效和灵活的类管理机制。

Global site tag (gtag.js) - Google Analytics