首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何递归加载java类及其引用类

递归加载Java类及其引用类是指在Java程序中,当一个类被加载时,如果该类引用了其他类,那么这些被引用的类也会被自动加载。这种加载方式称为递归加载。

在Java中,类的加载是由Java虚拟机(JVM)负责的。当程序需要使用某个类时,JVM会首先检查该类是否已经被加载,如果没有加载,则会按照以下步骤进行递归加载:

  1. 加载类:JVM会根据类的全限定名(包括包名和类名)查找类的字节码文件,并将其加载到内存中。类的字节码文件可以是.class文件,也可以是其他格式的文件(如.jar文件)。
  2. 验证类:JVM会对加载的类进行验证,确保其符合Java语言规范和安全要求。验证过程包括检查类的格式、语义和字节码的正确性。
  3. 准备类:JVM会为类的静态变量分配内存,并设置默认初始值。同时,JVM还会为类的静态变量和常量池中的符号引用建立内存地址的关联。
  4. 解析类:JVM会将类中的符号引用转换为直接引用,即将类、方法、字段等的符号引用解析为内存地址。这个过程可以在加载阶段之后进行,也可以在运行时进行。
  5. 初始化类:JVM会执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。类的初始化是在类被首次主动使用时进行的。

递归加载类及其引用类的优势在于可以方便地管理类之间的依赖关系,使得程序的结构更加清晰和模块化。递归加载还可以提高程序的性能,因为只有在需要使用某个类时才会加载它,避免了不必要的资源浪费。

递归加载Java类及其引用类的应用场景非常广泛,特别是在大型软件系统中。例如,当一个类库被多个应用程序共享时,递归加载可以确保每个应用程序只加载自己需要的类,避免了类的重复加载和内存浪费。此外,递归加载还可以用于实现插件化架构,使得程序可以动态加载和卸载插件。

对于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,无法给出具体的推荐。但腾讯云作为一家知名的云计算服务提供商,提供了丰富的云计算产品和解决方案,可以根据具体需求选择适合的产品进行使用。

总结:递归加载Java类及其引用类是一种在Java程序中自动加载被引用类的机制。它通过加载、验证、准备、解析和初始化等步骤,实现了类之间的依赖关系管理和性能优化。递归加载在大型软件系统和插件化架构中有广泛应用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JAVA加载过程&主动引用和被动引用

文章目录 1.java加载过程 1.1加载 1.2 链接 1.3 初始化 *说明 与方法 1.4 使用 1.5 卸载 2.被动引用和主动引用 2.1主动引用 2.1.1.遇到new、getstatic...2.2.3.常量在编译阶段会存入调用的常量池中,本质没有直接引用到定义的常量中,因此不会触发定义的常量初始化 2.3练习题 1.java加载过程 重新回顾了java的生命周期,主要有:加载...上述过程包括了一个java在jvm虚拟机中声明周期的全过程。 其中,加载、链接、初始化,称为加载过程。 而链接又包含了:验证、准备、解析等过程。见下图: ?...1.1加载 加载既是将class文件字节码加载到内存中,并将这些静态数据转换为jvm方法区运行时数据结构。在堆中生成一个代表这个java.lang.Class对象,作为方法区访问对象的入口。...2.被动引用和主动引用java虚拟机规范中,严格规定了,只有对进行主动引用,才会触发其初始化方法。而除此之外的引用方式称之为被动引用,不会触发的初始化方法。

98121

Java加载-加载

什么是加载 虚拟机把描述的数据从Class(Class文件或者网络或者其他地方,其实都是一串二进制流)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。...使用java.lang.reflect包的方法进行反射调用的时候,如果类没有初始化,则必须先初始化 初始化一个的时候,如果父没有被初始化(只有的父,接口的父不会),则需要先初始化父 JVM启动时首先初始化主...java.lang.Class对象,作为方法区(元数据区)这个的各种数据的访问入口 二进制字节流的来源可以是(但不仅仅是): Class文件 Zip包(也就是我们经常使用的JAR包、WAR包) 网络...非数组加载需要通过加载器实现,既可以使用系统的提供的引导加载,也可以使用用户自定义的加载器去完成,关于加载器后续我会单独写一篇文章来介绍,并且实现我们自己的一个加载器。...对于数组来说,数组是由Java虚拟机直接创建的,但是数组中的元素类型需要通过加载加载。数组的可见性与数组中元素的可见性一致,如果元素不是引用类型,数组的可见性将默认为public。

1.3K40
  • JAVA加载

    一、什么是加载 在介绍加载机制之前,先来看看,加载机制在整个 java 程序运行期间处于一个什么环节,下面使用一张图来表示: 从上图可以看,java 文件通过编译器变成了.class 文件,...,则其父 也 会 被 初 始 化 Java 虚 拟 机 启 动 时 被 标 明 为 启 动 ( JavaTest),直接使用 java.exe 命令来运行某个主好了,到目前为止就是加载机制的整个过程...在加载阶段其实我们提到过加载器,说是在后面详细说,在这就好好地介绍一下加载器。 三、加载器 虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的。...我们看到 java为我们提供了三个加载器,应用程序都是由这三种加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的加载器。这三种加载器的加载顺序是什么呢?...** 4、自定义加载器 在这一部分第一小节中,我们提到了 java 系统为我们提供的三种加载器,还给出了他们的层次关系图,最下面就是自定义加载器,那么我们如何自己定义 加载器呢?

    1.1K75

    Java(File递归

    java.io File:文件和目录路径名的抽象表示形式; Java把电脑中的文件和文件夹(目录)封装成一个File,我们可以使用File对文件和文件夹进行操作; 我们可以使用File的方法进行以下操作...: 创建文件/文件夹 删除文件和文件夹 获取文件和文件夹 判断文件和文件夹 对文件夹进行遍历 获取文件的大小 File是一个与系统无关的,任何操作系统都可以使用这个中的方法; static String..."); System.out.println(file1);//c:\java 注意: String parent:父路径 String child:子路径 File获取功能的方法 public...(方法自己调自己) 递归分为两种:第一种直接递归,第二种间接递归; 直接递归指:方法中方法直接调用自己; public class Dome {//直接递归 public static void...,保证递归能够停下来,否则会发生栈内存溢出; 在递归中虽然有限定条件,但是递归的次数不能太多,否则会发生栈内存溢出; 递归方法禁止递归:构造方法是创建对象使用的,一直递归会导致内存中有无数个对象; 递归使用的前提

    49230

    Java】File递归

    专栏介绍 【Java】 目前主要更新Java,一起学习一起进步。...本期介绍 本期主要介绍File递归 文章目录 第一章 File 1.1 概述 1.2 构造方法 1.3 常用方法 获取功能的方法 绝对路径和相对路径 判断功能的方法 创建删除功能的方法 1.4 目录的遍历...优化 第一章 File 1.1 概述 java.io.File 是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。...第二章 递归 2.1 概述 递归:指在当前方法内调用自己的这种现象。 递归的分类: 递归分为两种,直接递归和间接递归。 直接递归称为方法自身调用自己。...该接口的对象可以传递给File的listFiles(FileFilter) 作为参数, 接口中只有一个方法。

    67520

    加载Java加载机制解析

    接着通过k->set_java_ mirror(mirror())调用,让当前所创建的klassOop引用刚刚实例化的java.lang.Class对象。...打印结果显示Test中一共包含2个公开字段,与定义的完全一致。在这里,重点研究的是,java.lang.Class.getFields()接口究竟如何知道Test中有两个公开的字段。...以上便是一个Java加载的核心流程。了解了加载的核心流程之后,也许聪明的你会忍不住想,Java加载到底何时才会被触发呢?...Java加载由JVM自动触发——JVM执行完自身的若干初始化逻辑之后,第一个加载的便是Java程序的主。总体上而言,Java加载的链路如下: ?...(String)接口的入参,系统加载器据此加载目标Java

    91210

    JAVA加载过程

    一、什么是加载 在介绍加载机制之前,先来看看,加载机制在整个 java 程序运行期间处于一个什么环节,下面使用一张图来表示: 1.png 从上图可以看,java 文件通过编译器变成了.class...,则其父 也 会 被 初 始 化 Java 虚 拟 机 启 动 时 被 标 明 为 启 动 ( JavaTest),直接使用 java.exe 命令来运行某个主好了,到目前为止就是加载机制的整个过程...在加载阶段其实我们提到过加载器,说是在后面详细说,在这就好好地介绍一下加载器。 三、加载器 虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的。...我们看到 java为我们提供了三个加载器,应用程序都是由这三种加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的加载器。这三种加载器的加载顺序是什么呢?...** 4、自定义加载器 在这一部分第一小节中,我们提到了 java 系统为我们提供的三种加载器,还给出了他们的层次关系图,最下面就是自定义加载器,那么我们如何自己定义 加载器呢?

    58174

    Java 加载过程

    以下哪项不属于java加载过程?...A.生成java.lang.Class对象 B.int类型对象成员变量赋予默认值 C.执行static块代码 D.方法解析 从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载...验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的验证措施,以缩短虚拟机加载的时间。...解析 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对或接口、字段、方法、接口方法、方法类型、方法句柄和调用点限定符7符号引用进行。...初始化 初始化阶段是加载过程的最后一步,到了初始化阶段,才真正开始执行中定义的java程序代码。

    67020

    java加载

    加载机制 JVM加载机制分为五个部分: 加载,验证,准备,解析,初始化 加载 加载加载过程中的一个阶段,会在内存中生成一个代表这个java.lang.Class 对象,作为方法区这个的各种数据的入口...初始化 初始化阶段是加载的最后一个阶段,前面的加载阶段之后,除了在加载阶段可以自定义加载器之外,其他操作都有JVM主导 到了初始化阶段,才开始真正执行中定义的java程序代码 初始化阶段是 执行构造器...什么时候触发加载 什么情况需要开始加载过程的第一阶段(加载)呢? Java虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。...,定义了main方法的那个 加载器 虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的,JVM 提 供了 3 种类加载器: 启动加载器(Bootstrap ClassLoader...扩展加载器(Extension ClassLoader) 负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的 库。

    85220

    Java加载机制

    各个步骤的主要工作如下: 加载:一个规则,就是需要把.java文件如何变成.class文件。...这个规则就是在Java堆中生成一个代表这个java.lang.Class对象,作为方法区访问这些数据的访问入口。 验证:验证字节流是否符合Class文件格式的规范。...准备:给变量分配内存,并且设置变量初始值。 解析:将常量池的符号引用替换为直接引用的过程 初始化:根据程序去初始化变量和其他资源。 ? 2、简述加载器的双亲委派原则及双亲委派的意义?...答:当某个加载器在接到加载的请求时,会将加载任务委托给父加载器,依次递归,父加载器可以完成加载任务,就成功返回;不能加载则子类加载器自己完成加载。...意义:双亲委派避免的重复加载问题,以及避免Java核心的API被篡改,保证了代码安全。

    66931

    Java加载机制

    全盘负责 所谓全盘负责,就是当一个加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另外一个加载器来载入。...通俗的讲,就是某个特定的加载器在接到加载的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成加载任务,就成功返回;只有父加载器无法完成此加载任务时,才自己去加载。...双亲委派 双亲委派机制的优势:采用双亲委派模式的是好处是Java随着它的加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader...假设通过网络传递一个名为java.lang.Integer的,通过双亲委托模式传递到启动加载器,而启动加载器在核心Java API发现这个名字的,发现该类已被加载,并不会重新加载网络传递的过来的...java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

    10410

    java 自定义的加载器_Java如何自定义加载

    如何自定义加载器 如果想要编写自己的加载器,只需要两步: 继承ClassLoader 覆盖findClass(String className)方法 ClassLoader超的loadClass...方法用于将加载操作委托给其父加载器去进行,只有当该类尚未加载并且父加载器也无法加载该类时,才调用findClass方法。...加载器相关的API 1. java.lang.Class ClassLoader getClassLoader(): 获取加载该类的加载器 2.java.lang.ClassLoader ClassLoader...4.java.lang.Thread ClassLoader getContextClassLoader():获取加载器,该线程的创建者将其指定为执行该线程时最适合使用的加载器。...如果在启动一个线程时没有显式地设置上下文类加载器,则使用父线程的上下文类加载器。 参考文献《Java 核心技术 卷二》 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    1.4K10

    Java面试-加载

    文章目录 加载过程 加载(Load) 连接 初始化 加载器是如何定位到具体的文件并读取的?...在加载时,使用双亲委派模型(朔源委派加载模型) Java加载器是一个运行时核心基础设施模块,主要在启动之初进行的Load Link Init,即加载 连接 初始化 加载是一个将.class字节码文件实例化成...验证是更详细的校验,比如final是否合规,类型是否正确,静态变量是否合理等,准备阶段是为静态变量分配内存,并设定默认值,解析和方法确保之间的相互引用正确性,完成内存结构布局。...初始化 第三部,Init阶段执行构造器方法,如果复制运算是通过其他的静态方法完成的,那么会马上解析另一个,在虚拟机栈中执行完毕后通过返回值进行赋值。 加载器是如何定位到具体的文件并读取的?...第二,第三层加载器为Java语言实现,用户也可以自定义加载器。 加载规则 低层次的当前加载器,不能覆盖更高层加载器已经加载.

    35620

    Java加载

    参考链接: C++和Java中的Foreach 要想搞清楚这两个方法的区别,我们需要了解一下Class的加载过程。...Class的加载过程分为三步:  loading(装载)linking(链接)initializing(初始化)  大家可以通过这篇文章:Java魔法堂:加载机制入了个门来了解的详细加载过程。...(初始化),该参数在’Class.forName(String className)方法中默认值为true`,因此在加载的过程中会初始化的相关信息,比如中的静态块会被执行。...原因是加载过程中的缓存机制,由于方法1已经加载了该类,因此方法3不会再次加载该类,所以没有输出flag值,为了测试缓存的问题,我们将方法1与方法3的位置互换,程序的执行结果如下,可以看到方法3加载了该类...我们每次修改完代码都需要重启JVM来执行新的代码也是由加载的缓存机制造成的。

    32030

    Java加载,getClassLoader()

    转自 【java 加载的深入研究1】loadClass()的研究,IBM深入探讨 Java 加载加载器基本概念 顾名思义,加载器(class loader)用来加载 Java Java...加载器负责读取 Java 字节代码,并转换成 java.lang.Class的一个实例。每个这样的实例用来表示一个 Java 。...以上情况称为称对一个进行 “主动引用” ,除此种情况之外,均不会触发的初始化,称为“被动引用” 接口的加载过程与加载过程稍有不同。...符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。 直接引用(Direct Reference):直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。...在介绍代理模式背后的动机之前,首先需要说明一下 Java 虚拟机是如何判定两个 Java 是相同的。Java 虚拟机不仅要看的全名是否相同,还要看加载此类的加载器是否一样。

    28520

    Java加载

    什么是加载器 通过一个的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的。实现这个动作的代码模块称为“加载器”。...由于引导加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动加载器的引用,所以不允许直接通过引用进行操作。...,由于它不是Java,因此获得它的引用肯定返回null。...某个特定的加载器在接到加载的请求时,首先将加载任务委托给父 加载器(不是父),依次递归,如果父 加载器可以完成加载任务,就成功返回;只有父加载器无法完成此加载任务时,才自己去加载。...当Java虚拟机要加载一个时,到底派出哪个加载器去加载呢? 首先当前线程的加载器去加载线程中的第一个(假设为A)。 如果类A中引用B,Java虚拟机将使用加载A的加载器去加载B。

    79431

    Java加载机制

    准备:为的静态Field分配内存,并设置初始值。 解析:将的二进制数据中的符号引用替换成直接引用。...都维护着一个指向定义它的加载器的引用,通过 名.class.getClassLoader() 可以获取到此引用;然后通过 loader.getParent() 可以获取加载器的上层加载器。...层级关系 Java加载机制主要有以下三种: 双亲委派模型:如果一个加载器收到了加载的请求,它会先把请求委托给父加载器去完成,依次递归,一直到最顶层的启动加载器;只有在父加载器无法完成加载工作时...(注意:加载器中的父子关系并不是继承上的父子关系,而是加载器实例之间的关系) 全盘负责:当一个加载加载某个Class时,该Class所依赖和引用的其他Class也将由该类加载器载入,除非显式的使用另外一个加载器来载入...但是,它将扩展加载器保留在名为平台加载器的新名称下。ClassLoader包含一个名为getPlatformClassLoader()的静态方法,该方法返回对平台加载器的引用

    1.1K30

    Java加载机制

    加载Java加载需要用到加载器。加载器负责装入,搜索网络,jar,zip,文件夹,二进制数据,内存等指定位置的资源。...一个Java程序运行,至少有3个不同的加载器实例,负责加载不同的。...$AppClassLoader@18b4aac2 JVM如何知道我们的在何方 class信息可以存在不同的地方,那么JVM是如何知道我们的存在什么地方的哪?...双亲委派模型 Java中的并不会重复加载,同一加载器,同一名,代表的是同一个。而避免重复加载的主要原因在于JVM在加载时默认采用的是双亲委派模型。...所谓的双亲委派模型,就是某个特定的加载器在接到加载请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成加载任务,就成功返回;只有父加载器无法完成此加载任务时,才自己去加载

    58510
    领券