java编译器如何找到没有头文件的类?

时间:2010-10-28 14:51:47

标签: java compilation

当我们在jar中引用类className时,如果没有头文件(如c/c++中),它是如何知道它是否定义的?

5 个答案:

答案 0 :(得分:2)

运行Java编译器或应用程序本身时,可以指定类路径,其中列出了要加载类的所有jar和目录。一个jar只包含一堆类文件;这些文件中有足够的元数据,不需要额外的头文件。

答案 1 :(得分:2)

Java与classloaders一起使用。编译需要类,因为它将执行静态类型检查以确保您使用每种方法的正确签名。

在编译它们之后,它们没有像在C / C ++编译器中那样链接,所以基本上每个.class文件都是独立的。当然,这意味着当您要执行它时,您必须提供程序使用的编译类。所以它与C和C ++如何准备可执行文件略有不同。你根本没有链接阶段,不需要它。

类加载器将通过将它们添加到JVM使用的运行时库来动态加载它们。

实际上,JVM使用的许多类加载器具有不同的权限和属性,您也可以显式调用它以请求加载类。发生的事情也可能是一种“懒惰”加载,其中编译的.class代码在需要时加载(如果被问及的类不在类路径中,则此加载过程可以抛出ClassNotFoundException

答案 2 :(得分:1)

jar文件中的类包含所有必需的信息(类名,方法签名等),因此不需要头文件。

编译多个类时,javac足够聪明,可以自动编译依赖项,因此系统仍可正常工作。

答案 3 :(得分:0)

它查看类路径并尝试从那里加载类以获得它的定义。

答案 4 :(得分:0)

将Java文件编译为java字节码的类文件。这些类文件驻留在一个文件结构中,其中顶级由classpath变量指向。在C / C ++中编译会创建可以链接到可执行二进制文件的目标文件。 Java仅编译为字节码文件,这些文件在运行时由JVM引入。以下提供了更多解释。

http://en.wikipedia.org/wiki/Java_bytecode

http://en.wikipedia.org/wiki/Java_compiler

http://en.wikipedia.org/wiki/Java_Virtual_Machine