首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java类加载

Java类加载
EN

Stack Overflow用户
提问于 2015-02-02 16:52:43
回答 1查看 1K关注 0票数 6

我想了解Java类加载器是如何工作的。我读过一些文章,但有些东西对我来说还不清楚。

据我所知,第一类加载器是Bootstrap类加载器(BCL)。是由JVM加载的吗?

之后,BCL加载rt.jar库和扩展类加载器(ECL)。

反过来,ECL加载扩展和应用程序类加载器(ACL)。ACL负责从类路径加载所有用户开发的类。

这个描述正确吗?

这里有一些问题:

  1. 内存中只存在每个类加载器的一个实例?(BCL,ECL,ACL)?
  2. 我看过授权原则,但对我来说有点不清楚。它是如何工作的,让我们假设我们需要加载MyClass。首先,jvm将这个类名给ACL,这里我不清楚,ACL遍历类路径,如果没有这样的类委托给父类或它在调用后立即将这项工作委托给父级或父级,我的意思是JVM给ACL赋予类名,它不搜索这个类将它交给ECL,这个CL反过来也不做任何工作并将其交给BCL,并且只有当BCL找不到这个类时,它才会将它返回到较低级别(ECL) .诸若此类。正确的链子是什么?
  3. 当我们创建自定义类加载器时,它的父类是什么?应用ClassLoader?我们是否可以指定,例如ECL。至于类加载器的层次结构不是继承,我们将在构造函数中指定父类。我们能否获得ECL类加载器的实例,以便在我们的自定义CL中将它指定为构造函数中的父类。
  4. 为什么像String、Object等类不返回任何ClassLoadder?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-02 17:17:58

答案:

  1. 据我所知,第一类加载器是Bootstrap类加载器(BCL)。它是否由JVM加载?

这不是显式定义的,但很可能是用本机代码编写的。

  1. 之后,BCL加载rt.jar库和扩展类加载器(ECL)。

是的,它将加载rt.jar (直到Java8,就像在Java9中一样,将会有新的模块系统)。是否加载ECL未显式定义。

  1. 反过来,ECL加载扩展和应用程序类加载器(ACL)。ACL负责从类路径加载所有用户开发的类。

是的,它加载扩展,并且没有显式定义它是否加载ACL。实际上,ACL加载类路径条目。

  1. 内存中只存在每个类加载器的一个实例?(BCL,ECL,ACL)?

是的,这是正确的。由于类标识被定义为一对FQCN及其有效的类加载器,否则它将无法工作。

  1. 我看过授权原则,但对我来说有点不清楚。它是如何工作的,让我们假设我们需要加载MyClass。首先,jvm将这个类名给ACL,这里我不清楚,ACL遍历类路径,如果没有这样的类委托给父类或它在调用后立即将这项工作委托给父级或父级,我的意思是JVM给ACL赋予类名,它不搜索这个类将它交给ECL,这个CL反过来也不做任何工作并将其交给BCL,并且只有当BCL找不到这个类时,它才会将它返回到较低级别(ECL) .诸若此类。正确的链子是什么?

在标准的中,有父先委托模型,这意味着类加载器将首先询问它的父类,然后才会尝试自己加载类。

  1. 当我们创建自定义类加载器时,它的父类是什么?应用ClassLoader?我们是否可以指定,例如ECL。至于类加载器的层次结构不是继承,我们将在构造函数中指定父类。我们能否获得ECL类加载器的实例,以便在我们的自定义CL中将它指定为构造函数中的父类。

自定义类加载器的默认父级是应用程序类加载器.

问题是你为什么要这么做?您的程序不太可能正确运行。从形式上说,您可以通过YourClass.class.getClassLoader().getParent().来完成这一任务。

  1. 为什么像String、Object等类不返回任何ClassLoadder?

在API. null中,引导类加载器表示为。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28282667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档