當我們在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