我正在阅读 Java 中的类加载。
动机
假设我们有一个看起来像这样的类加载器层次结构,我知道加载的类First
不能被加载的类直接访问Second
(反之亦然)。
Bootstrap
|
System
|
Common
/ \
First Second
我也知道类加载器会检查其父类加载器是否可以加载该类,如果是这种情况,则将加载委托给其父类。
问题
类加载器如何实际确定它们是否可以加载某个给定的类?
我正在阅读 Java 中的类加载。
假设我们有一个看起来像这样的类加载器层次结构,我知道加载的类First
不能被加载的类直接访问Second
(反之亦然)。
Bootstrap
|
System
|
Common
/ \
First Second
我也知道类加载器会检查其父类加载器是否可以加载该类,如果是这种情况,则将加载委托给其父类。
类加载器如何实际确定它们是否可以加载某个给定的类?
这取决于类加载器的实现。但是 ClassLoader 可以加载的所有类都由ClassLoader.findClass(String)检索
有许多实现,但最常见的是URLClassLoader,它从目录和 jar 文件加载类。
类加载器检查路径变量中的所有类(java 类文件) 。CLASSPATH
如果在那里找到您的课程,则它存在,否则不存在。
因此,实际上,您的/src
目录和所有子目录(=packages)都会被扫描。
类加载器将请求的类名转换为文件名,然后尝试从文件系统中找到该名称的“类文件”。正如@poitroae 所指出的,它使用 CLASSPATH 变量(如果已设置)作为起点。大多数 IDE 等都将其扩展为包含项目的工作目录。