我想了解Java类加载器的工作方式。我已经阅读了一些文章,但是有些事情对我来说仍然不清楚。
据我了解,第一类加载器是Bootstrap类加载器(BCL)。 是否由JVM加载?
之后,BCL加载rt.jar库和扩展类加载器(ECL)。
反过来,ECL加载扩展和应用程序类加载器(ACL)。 ACL负责从类路径加载所有用户开发的类。
这个描述正确吗?
有一些问题:
最佳答案
答案:
这没有明确定义,但是很可能用 native 代码编写。
是的,它将加载rt.jar(与Java 8一样,直到Java 8中都会有新的模块系统)。没有明确定义是否加载ECL。
是的,它会加载扩展,并且是否显式定义是否加载ACL。实际上,ACL加载类路径条目。
是的,这是正确的。由于类标识定义为一对FQCN及其有效的类加载器,否则它将无法工作。
在标准Java中,有一个父级优先委托(delegate)模型,这意味着类加载器将首先询问其父级,然后才尝试自行加载一个类。
自定义类加载器的默认父级是应用程序类加载器。
问题是为什么您需要这样做?您的程序不太可能会正常运行。正式地,您可以通过
YourClass.class.getClassLoader().getParent()
做到这一点。 bootstrap 类加载器在API中表示为
null
。