2010-10-28 62 views

回答

0

它查看類路徑並嘗試從那裏加載類以獲取其定義。

+0

所以這是的**編譯**和** **鏈接在Java中沒有單獨的進程? – ollydbg 2010-10-28 14:57:38

+0

@ollydbg:是的。鏈接發生在運行時。 – musiKk 2010-10-28 14:59:51

+0

@ollydbg:有單獨的進程,但每步需要的信息之間有更多的重疊。 – 2010-10-28 15:03:46

2

當您運行Java編譯器或應用程序本身,你可以指定一個類路徑其中列出了所有的罐子,你是從加載類目錄。一個jar只包含一堆類文件;這些文件具有足夠的元數據,不需要額外的頭文件。

1

jar文件中的類包含所有必需的信息(類名稱,方法簽名等),因此不需要頭文件。

當您編譯多個類時javac足夠聰明,可以自動編譯依賴關係,因此係統仍能正常工作。

+0

我曾經認識一個曾經去過奧克蘭大學的卡梅隆·斯金納,並且與Tramping Club的人羣有過一些關係。你是Cameron Skinner嗎?好奇。 :-) – 2010-10-29 03:22:56

+0

是的,那就是我:) – 2010-10-29 10:54:11

2

Java適用於classloaders。編譯需要類,因爲它將執行靜態類型檢查以確保您使用每個方法的正確簽名。

編譯它們之後,它們不像C/C++編譯器那樣鏈接,因此基本上每個.class文件都是獨立的。當然,這意味着當你要執行它時,你將不得不提供你的程序使用的編譯類。所以與C和C++如何準備可執行文件有點不同。你根本沒有一個連接階段,這是不需要的。

類加載器將通過將它們添加到JVM使用的運行庫中來將它們加載。

實際上,JVM使用的許多類加載器具有不同的權限和屬性,您還可以顯式調用它以請求加載類。發生的情況也可能是一種「惰性」加載,其中編譯的.class代碼僅在需要時加載(並且如果所請求的類不在類路徑中,則此加載過程可以拋出ClassNotFoundException