【发布时间】:2011-04-03 01:06:46
【问题描述】:
我有 15 年的 C++ 经验,但对 Java 很陌生。我试图了解 Java 如何处理头文件的缺失。我有几个与此问题相关的问题。
具体来说,假设我为导入第 3 方类“Z”(并使用 Z)的类“A”编写源代码。我知道在编译时,Java 编译器必须“访问”有关 Z 的信息才能编译 A.java,创建 A.class。因此,Z.java 或 Z.class(或包含其中之一的 JAR;比如 Z.jar)在编译时必须存在于本地文件系统中 - 对吗?
编译器是否使用类加载器来加载 Z(重申 - 在编译时)?
如果我在编译时使用了类加载器是正确的,如果需要用户定义的类加载器 (L) 怎么办 - 并且是正在编译的项目的一部分?例如,假设 L 负责通过网络在运行时下载 Z.class?在这种情况下,Java 编译器如何在编译时获取 Z.class?会不会尝试先编译L,然后在编译时使用L获取Z?
我了解使用 Maven 构建项目时,Z.jar 可以在编译时位于 Internet 上的远程存储库中 - 位于 ibiblio 或 POM 文件中定义的自定义存储库中。我希望我是正确的,是 MAVEN 负责在编译时下载 3rd-party JAR 文件,而不是编译器的 JVM?
但是请注意,在运行时,A.class 再次需要 Z.class - JRE 怎么知道从哪里下载 Z.class(没有 Maven 的帮助)?还是开发人员有责任将 Z.class 与 A.class 一起随应用程序一起提供(比如在 JAR 文件中)? (...假设不使用用户定义的类加载器。)
现在是一个相关的问题,只是为了确认:我假设一旦编译,A.class 只包含指向 Z.class 的符号链接 - Z.class 的字节码不是 A.class 的一部分;如果我错了,请纠正我。 (在 C++ 中,静态链接会将字节从 Z.class 复制到 A.class,而动态链接则不会。)
关于编译过程的另一个相关问题:一旦描述 Z 的必要文件在编译时位于 CLASSPATH 上,编译器是否需要 Z.class 中的字节码才能编译 A.java(并将构建 Z.class ,如有必要,来自 Z.java),还是 Z.java 足以满足编译器的需要?
我的整体困惑可以总结如下。似乎 Z 的完整 [字节] 代码需要出现两次——编译期间一次,运行时第二次——这对于 Java 程序引用的 ALL 类必须是正确的。换句话说,每个课程都必须下载/呈现两次。在编译期间,不能将单个类仅表示为头文件(就像在 C++ 中一样)。
【问题讨论】: