jvm在初期是将.java文件,编译成.class文件,当程序运行的时候,Java 虚拟机就将编译生成的 . class 文件按照需求和一定的规则加载进内存,组织成为一个完整的 Java 应用程序,jvm会把每个单独的类和接口编译成一个单独的.class文件,这些文件对于 Java 运行环境来说就是一个个可以动态加载的单元。我们可以在不重新编译其它代码的情况下,只编译需要修改的单元,并把修改文件编译后的 . class 文件放到 Java 的路径当中, 等到下次该 Java 虚拟机器重新激活时,这个逻辑上的 Java 应用程序就会因为加载了新修改的 .class 文件,自己的功能也做了更新,这就是 Java 的动态性。
1. 预先加载与依需求加载
Java 运行所需要的基本类采用预先加载,的方法全部加载要内存当中,因为这些单元在 Java 程序运行的过程当中经常要使用的,主要包括 JRE 的 rt.jar 文件里面所有的 .class 文件。
我们在程序中需要使用自己定义的类的时候就要使用依需求加载方法。
2. 隐式加载和显示加载
程序中用 new 关键字来定义一个实例变量, JRE 在执行到 new 关键字的时候就会把对应的实例类加载进入内存,用的也很多, JRE 系统在后台自动的帮助用户加载,减少了用户的工作量,也增加了系统的安全性和程序的可读性。
程序员自己写程序把需要的类加载到内存当中(显示加载)
Class c = Class.forName("TestClass");
TestClass object = (TestClass)c.newInstance
我们通过 Class 类的 forName (String s) 方法把自定义类 TestClass 加载进来,并通过 newInstance ()方法把实例初始化
Test test = new Test();//Test 类为自定义的一个测试类;
ClassLoader cl = test. getClass().getClassLoader();
// 获取 test 的类装载器;
Class c = Class.forName("TestClass", true, cl);
因为一个类要加载就必需要有加载器,这里我们是通过获取加载 Test 类的加载器 cl 当作加载 TestClass 的类加载器来实现加载的。
3. 自定义类加载机制
URL url = new URL("file:/d:/test/lib/");
URLClassLoader urlCL = new URLClassLoader(new URL[]{url});
Class c = urlCL.loadClass("TestClassA");
TestClassA object = (TestClassA)c.newInstance();
object.method();
首先定义 URL 指定类加载器从何处加载类, URL 可以指向网际网络上的任何位置,也可以指向我们计算机里的文件系统 ( 包含 JAR 文件 ) .上述范例当中我们从 file:/d:/test/lib/ 处寻找类;然后定义 URLClassLoader 来加载所需的类,最后即可使用该实例了。
4. 类加载器的阶层体系
当执行hllo.class时候,java.exe会自动找到很显眼的jre位置,接着会在其中找到jvm.dll,(在jdk和jre中都有jvm)有了.dll文件之后激活jvm加载动态库,jvm活后,先做一些初始化的动作,比如说读取系统参数等。
然后,一旦初始化动作完成之后,就会产生第一个类加载器―― Bootstrap Loader (靴带机制,就是系上鞋带就要走路了), Bootstrap Loader 是由 C++ 所撰写而成,这个 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader .然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是, Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。
这三个加载器就构成我们的 Java 类加载体系。他们分别从以下的路径寻找程序所需要的类:
BootstrapLoader : sun.boot.class.path
ExtClassLoader: java.ext.dirs
AppClassLoader: java.class.path
这三个系统参量可以通过 System.getProperty() 函数得到具体对应的路径。大家可以自己编程实现查看具体的路径。
分享到:
相关推荐
### 深入研究Java类加载机制 #### 一、Java类加载机制概述 Java类加载机制是Java程序运行的第一步,它对于理解Java虚拟机(JVM)的行为至关重要。类加载过程涉及到类的加载、链接(验证、准备、解析)、初始化等...
### Java 类加载机制详解 ...总结而言,Java 类加载机制是一个复杂而精细的过程,它不仅确保了Java程序的安全性和可移植性,还提供了强大的灵活性。理解类加载机制对于开发高效稳定的Java应用程序至关重要。
本文将深入探讨 Java 类加载机制的核心概念和技术细节,帮助开发者更好地理解 Java 类加载的过程,以及如何利用这一机制解决实际问题。 #### 二、类和数据的关系 在 Java 中,类和数据有着密切的关系。类定义了...
类加载机制的过程可以分为三个阶段:加载、链接和初始化。 加载阶段:在加载阶段,Java虚拟机将.class文件加载到内存中,并将其转换为机器可执行的代码。加载阶段是类加载机制的第一阶段。 链接阶段:在链接阶段,...
类加载机制的过程可以分为以下几个阶段: 1. 加载(Loading):在硬盘上查找并通过 IO 读入字节码文件,使用到类时才会加载,例如调用类的 main() 方法,new 对象等等。在加载阶段会在内存中生成一个代表这个类的 ...
该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...
Java 类加载机制是Java平台的核心特性之一,它负责将类的字节码加载到Java虚拟机(JVM)中并转换为运行时的类对象。理解这一机制对于优化应用程序性能和解决类相关的错误至关重要。 首先,类加载的过程分为三个主要...
### JAVA类加载机制与动态代理 #### 一、类加载机制 ##### 1.1 类加载的时机 类加载机制负责将描述类的数据从`.class`文件加载到内存,并进行必要的校验、转换解析和初始化,使之成为可以被Java虚拟机直接使用的...
JAVA 类加载机制是Java平台核心特性之一,它关乎到程序的运行时环境和代码的动态加载。理解这一机制有助于开发者解决与对象创建、配置问题、应用程序发布等相关的问题。以下是关于JAVA 类加载机制的详细分析: 首先...
本篇主要基于“译 Java类加载机制(一、二)”的博客内容,深入探讨Java的类加载过程、类加载器以及双亲委派模型。 首先,理解类加载机制的三个基本过程:加载、验证、准备、解析和初始化。加载是找到类的字节码并...
通过对 Java 类加载器的体系结构、动态类加载机制原理、实现过程和实现方法的分析,可以实现动态类加载机制,并且可以应用于网络教学环境中。 Java 动态类加载机制的应用前景非常广阔,具有非常重要的意义。 本文...
总结起来,Java类加载机制的双亲模型保证了系统的稳定性,而自定义类加载器则提供了灵活性,允许我们在需要时对加载过程进行控制,如代码增强、隔离和版本管理。理解并掌握这些概念对于深入理解和优化Java应用程序至...
Java注解、反射、字节码和类加载机制是Java编程中的核心概念,它们在实际开发中扮演着重要角色。让我们深入探讨这些知识点。 **Java注解(Annotation)**: Java注解是一种元数据,它提供了在编译时或运行时处理代码的...
Java 类加载机制是Java技术体系中的重要组成部分,它关乎到程序运行时的类查找与实例化。当遇到`java.lang.ClassNotFoundException`异常时,通常是因为类加载过程出现了问题。了解类加载机制对于解决这类问题至关...
类加载机制涉及类加载顺序、类加载器的体系结构、类加载过程以及双亲委派模型等核心概念。架构师或高级开发人员必须深刻理解这些知识点,以便在进行大型互联网平台架构设计和开发时做出正确的决策。 首先,类加载指...
Java类加载机制是Java运行时环境中的核心组成部分,它负责将编译后的字节码(.class文件)加载到Java虚拟机(JVM)中,使得程序能够执行。这一过程涉及多个步骤,包括加载、验证、准备、解析和初始化。理解类加载...
Java类加载机制是Java程序运行的关键部分,它使得程序能够在运行时动态加载和执行。类加载涉及多个步骤,包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化...
在Java中,类加载器(Class Loader)是一项核心机制,用于将字节码(.class文件)加载到JVM中,使其成为运行时的对象。类加载器不仅实现了类的加载功能,还确保了Java程序在多线程环境中的安全性和隔离性。类加载器...