当我们在jar中引用类className
时,它是如何知道在没有头文件时是否定义了它(如c/c++
)?java编译器如何找到没有头文件的类?
回答
它查看类路径并尝试从那里加载类以获取其定义。
当您运行Java编译器或应用程序本身,你可以指定一个类路径其中列出了所有的罐子,你是从加载类目录。一个jar只包含一堆类文件;这些文件具有足够的元数据,不需要额外的头文件。
jar文件中的类包含所有必需的信息(类名称,方法签名等),因此不需要头文件。
当您编译多个类时javac
足够聪明,可以自动编译依赖关系,因此系统仍能正常工作。
我曾经认识一个曾经去过奥克兰大学的卡梅隆·斯金纳,并且与Tramping Club的人群有过一些关系。你是Cameron Skinner吗?好奇。 :-) – 2010-10-29 03:22:56
是的,那就是我:) – 2010-10-29 10:54:11
Java适用于classloaders。编译需要类,因为它将执行静态类型检查以确保您使用每个方法的正确签名。
编译它们之后,它们不像C/C++编译器那样链接,因此基本上每个.class文件都是独立的。当然,这意味着当你要执行它时,你将不得不提供你的程序使用的编译类。所以与C和C++如何准备可执行文件有点不同。你根本没有一个连接阶段,这是不需要的。
类加载器将通过将它们添加到JVM使用的运行库中来将它们加载。
实际上,JVM使用的许多类加载器具有不同的权限和属性,您还可以显式调用它以请求加载类。发生的情况也可能是一种“惰性”加载,其中编译的.class代码仅在需要时加载(并且如果所请求的类不在类路径中,则此加载过程可以抛出ClassNotFoundException
)
Java文件是编译成java字节码的类文件。这些类文件驻留在文件结构中,顶层由classpath变量指向。在C/C++中编译创建可链接到可执行文件的目标文件。 Java只能编译成JVM在运行时拉入的字节码文件。以下提供更多解释。
http://en.wikipedia.org/wiki/Java_bytecode
- 1. 编译类路径的Java没有找到所有jar文件
- 2. Qt编译器找不到头文件
- 3. C编译器找不到头文件
- 4. 设置CLASSPATH但Java编译器不能找到类文件
- 5. 编译器在源文件夹中找不到.java类
- 6. 没有公共类的.java文件的Java编译
- 7. 编译器如何理解java 8编译jar到Java 6编译java类文件
- 8. gcc编译器在编译时查找头文件在哪里?
- 9. C++编译器标志11 - 没有找到计时文件
- 10. 编译器找不到我的框架头文件
- 11. Maven没有编译类,在war文件中没有类文件
- 12. 如何找到MySQL头文件来编译QT
- 13. 如何“反编译”Java类文件?
- 14. 编译器没有找到基类的方法
- 15. C/C++编译器如何找到头文件中原型的定义?
- 16. 编译器在Windows上找不到GCD头文件
- 17. UBUNTU C++编译器找不到头文件
- 18. 编译器找不到安装库头
- 19. 反编译java类文件
- 20. 头文件中的类 - 无法编译?
- 21. Hadoop的java编译器无法找到文件
- 22. 编译器找不到.lib文件
- 23. 编译器找不到EXE文件
- 24. 编译器找不到ui_xyz.h文件
- 25. 码头亚军。 PWC6349:无法找到一个java编译器编译
- 26. 编译头文件
- 27. CMakeLists - 让没有找到头文件
- 28. 有没有办法反编译java类
- 29. Java类编译器在类路径上没有看到软件包
- 30. 没有CLI头反编译?
所以这是的**编译**和** **链接在Java中没有单独的进程? – ollydbg 2010-10-28 14:57:38
@ollydbg:是的。链接发生在运行时。 – musiKk 2010-10-28 14:59:51
@ollydbg:有单独的进程,但每步需要的信息之间有更多的重叠。 – 2010-10-28 15:03:46