我想了解Java类加载器的工作方式。我已经阅读了一些文章,但是有些事情对我来说仍然不清楚。

据我了解,第一类加载器是Bootstrap类加载器(BCL)。 是否由JVM加载?

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

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

这个描述正确吗?

有一些问题:

  • 内存中是否存在每个类加载器的一个实例? (BCL,ECL,ACL)?
  • 我已经看过委派原理,但是对我来说还不清楚。它是如何工作的,假设我们需要加载MyClass。第一个jvm将此类名称提供给ACL,这对我来说还不清楚,ACL会通过类路径进行查找,如果没有这样的类将这项工作委托(delegate)给父级,或者在调用后立即将这项工作委托(delegate)给父级,我的意思是JVM将类名提供给ACL,它不搜索此类,将其提供给ECL,此CL反过来也不做任何工作,而是将其提供给BCL,并且仅当BCL找不到此类时,才将其返回到较低的类级别(ECL)....依此类推。什么是正确的链条?
  • 当我们创建自定义类加载器时,它的父类是什么?应用程序类加载器?我们可以指定例如ECL吗?至于类加载器的层次结构不是继承,我们在构造函数中指定父级。我们能否获得ECL类加载器的实例,以在自定义CL中将其指定为构造函数中的父级。
  • 为什么像String,Object之类的类不返回任何ClassLoadder?
  • 最佳答案

    答案:



  • 这没有明确定义,但是很可能用 native 代码编写。


  • 是的,它将加载rt.jar(与Java 8一样,直到Java 8中都会有新的模块系统)。没有明确定义是否加载ECL。


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


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


  • 在标准Java中,有一个父级优先委托(delegate)模型,这意味着类加载器将首先询问其父级,然后才尝试自行加载一个类。


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

    问题是为什么您需要这样做?您的程序不太可能会正常运行。正式地,您可以通过 YourClass.class.getClassLoader().getParent() 做到这一点。


  • bootstrap 类加载器在API中表示为null
  • 10-07 12:03