当前位置: 首页 > 面试题库 >

什么是Java ClassLoader?

叶淇
2023-03-14
问题内容

简单地说,什么是Java ClassLoader?何时使用Java?为什么?

好的,我读了一篇维基文章。ClassLoader加载类。好。因此,如果我包含jar文件并导入,则ClassLoader可以完成这项工作。

我为什么要打扰这个ClassLoader?我从未使用过它,也不知道它的存在。

问题是,为什么ClassLoader类存在?而且,您如何在实践中使用它?(案例存在,我知道。)


问题答案:

摘自Sun的这个不错的教程:

动机

用静态编译的编程语言(例如C和C ++)编写的应用程序被编译为本地的,机器特定的指令,并保存为可执行文件。将代码组合成可执行的本机代码的过程称为链接-
将单独编译的代码与共享库代码合并以创建可执行应用程序。在动态编译的编程语言(例如Java)中,这是不同的。在Java中,由Java编译器生成的.class文件将保持原样,直到加载到Java虚拟机(JVM)中为止-
换句话说,链接过程由JVM在运行时执行。将类“按需”加载到JVM中。当加载的类依赖于另一个类时,该类也将被加载。

启动Java应用程序时,要运行的第一个类(或应用程序的入口点)是带有称为main()的公共静态void方法的类。此类通常具有对其他类的引用,并且所有加载引用的类的尝试均由类加载器执行。

为了大致了解这种递归类加载以及类加载的思想,请考虑以下简单类:

public class HelloApp {
   public static void main(String argv[]) {
      System.out.println("Aloha! Hello and Bye");
   }
}

如果您通过指定-
verbose:class命令行选项来运行此类,以便显示正在加载的类,您将获得如下所示的输出。请注意,这只是部分输出,因为列表太长而无法在此处显示。

prmpt>java -verbose:class HelloApp



[Opened C:\Program Files\Java\jre1.5.0\lib\rt.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jsse.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jce.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
[Loaded java.lang.Throwable from shared objects file]
.
.
.
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Loaded java.security.Principal from shared objects file]
[Loaded java.security.cert.Certificate from shared objects file]
[Loaded HelloApp from file:/C:/classes/]
Aloha! Hello and Bye
[Loaded java.lang.Shutdown from shared objects file]
[Loaded java.lang.Shutdown$Lock from shared objects file]

如您所见,应用程序类(HelloApp)所需的Java运行时类首先被加载。

Java 2平台中的类加载器

Java编程语言不断发展,使应用程序开发人员的生活每天都变得更加轻松。这是通过提供API来完成的,这些API通过允许您专注于业务逻辑而不是基本机制的实现细节来简化您的生活。为了反映Java平台的成熟,最近将J2SE
1.5更改为J2SE 5.0可以证明这一点。

从JDK
1.2开始,JVM内置的引导类加载器负责加载Java运行时的类。该类加载器仅加载在引导类路径中找到的类,并且由于它们是受信任的类,因此不会像对不信任的类那样执行验证过程。除了引导类加载器之外,JVM还具有扩展类加载器,用于从标准扩展API加载类,以及系统类加载器,用于从常规类路径以及应用程序类加载类。

由于有多个类加载器,因此它们在树中表示,其根是引导类加载器。每个类加载器都有对其父类加载器的引用。当要求类加载器加载类时,它会在尝试加载项目本身之前先咨询其父类加载器。父级依次咨询其父级,依此类推。因此,只有在所有祖先类加载器都找不到该类后,当前类加载器才涉及。换句话说,使用了委托模型。

java.lang.ClassLoader类

java.lang.ClassLoader是,可以由需要延长在其中JVM动态加载类的方式应用作为子类的抽象类。java.lang.ClassLoader实例化新的类加载器时,(及其子类)中的构造函数允许您指定父级。如果您未明确指定父级,则会将虚拟机的系统类加载器指定为默认父级。换句话说,ClassLoader类使用委托模型来搜索类和资源。因此,ClassLoader的每个实例都有一个关联的父类加载器,因此当请求查找类或资源时,在尝试查找该类或资源本身之前,将任务委派给其父类加载器。loadClass()当调用ClassLoader
的方法以加载类时,它按顺序执行以下任务:

如果已经加载了一个类,它将返回它。否则,它将对新类的搜索委托给父类加载器。如果父类加载器找不到该类,则loadClass()调用该方法findClass()以查找和加载该类。finalClass()如果父类加载器找不到该类,则该方法在当前类加载器中搜索该类。

原始文章中还有更多内容,它还向您展示了如何实现自己的网络类加载器,它回答了有关原因(以及如何)的问题。另请参阅API文档。



 类似资料:
  • 问题内容: 什么是selenium? 当您打开Selenium的官方页面时,您首先读到的是“什么是Selenium?”中的“ Selenium automates browser”。部分。“selenium的哪个部分适合我?”部分 下面提供了Selenium WebDriver和Selenium IDE之间的选择。由此,我推断出Selenium是一组工具,并且该集合包括IDE,WebDriver

  • 硒是什么? 当你打开Selenium的官方页面,首先看到的是“什么是Selenium”中的“Selenium自动浏览器”。节。“硒的哪一部分对我合适?”下面提供了Selenium WebDriver和Selenium IDE之间的选择。由此,我推断Selenium是一个工具集合,该集合包括IDE、WebDriver API(语言绑定)、网格、Selenium独立服务器、浏览器驱动程序。一个人必须下

  • 本文向大家介绍什么是事务?什么是锁?相关面试题,主要包含被问及什么是事务?什么是锁?时的应答技巧和注意事项,需要的朋友参考一下 答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔

  • 我在这里读到 写入共享引用类型<代码> 理解<代码> 在另一个地方,我阅读了以下代码: 结构人中的a是什么 名称的含义是什么: 如果想避免使用

  • 我几天前听说了Docker的事,想过去看看。 但事实上,我不知道这个“容器”的用途是什么? 什么是容器? 它能取代一个专门用于开发的虚拟机吗? 简单地说,在公司中使用Docker的目的是什么?主要的优势?

  • 本文向大家介绍什么是batch normalization,原理是什么?相关面试题,主要包含被问及什么是batch normalization,原理是什么?时的应答技巧和注意事项,需要的朋友参考一下 Batch Normalization就是在训练过程,每一层输入加一个标准化处理。 深度神经网络之所以复杂有一个原因就是由于在训练的过程中上一层参数的更新使得每一层的输入一直在改变。所以有个办法就是去

  • 本文向大家介绍什么是pytest?其优点是什么?,包括了什么是pytest?其优点是什么?的使用技巧和注意事项,需要的朋友参考一下 Pytest是python中的测试框架。要安装pytest,我们需要使用命令pip install pytest。安装后,我们可以通过pytest –version命令验证是否已安装python 。pytest的版本应该是已知的。 Pytest可用于创建和执行测试用例

  • 本文向大家介绍什么是主键?什么是外键?相关面试题,主要包含被问及什么是主键?什么是外键?时的应答技巧和注意事项,需要的朋友参考一下 主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。