Ⅰ jvm如何在運行時動態把java文本編譯成class,然後載入到jvm
為了在Java程序運行時動態編譯Java源代碼並生成Class文件,避免將編譯產物存到文件中,可以採用特殊的方法,例如自定義實現JavaFileManager和JavaFileObject。這類操作較為復雜,但提供了一種靈活的解決方案。
實現策略可以分為兩步:首先在運行時編譯Java源代碼,獲取編譯後的位元組碼;其次,使用自定義類載入器在運行時定義這些類。通過這種方式,無需文件操作,直接在內存中完成編譯與載入過程。
在使用編譯器API進行動態編譯時,可以遵循上述步驟。涉及的關鍵類JavaFileManager和JavaFileObject需要自定義實現,以滿足特定的文件管理需求。
然而,在嘗試使用Java11環境下運行上述代碼時,可能會遇到編譯失敗的問題,而Java8環境下則能正常運行。具體原因尚未查明,可能涉及Java版本的兼容性或API實現細節的變動。
Ⅱ 簡述JAVA程序的編輯編譯和運行過程
Java應用程序的開發周伍碧期包括編譯、下載、解釋和執行幾個部分。Java編譯程序將 Java源程序翻譯為JVM可執行代碼--位元組碼。Java將符號引用信息保留在位元組碼中,由解釋器在運行過程中創立內存布局,然後再通過查 表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性。
運行JVM位元組碼的工作是由解釋器( java命令 )來完成的。解釋執行過程分三部進行:代碼的裝入、代碼的校驗和代碼的執行。裝入代碼的工作由"類裝載器"(class loader)完成。類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。當類裝載春陵器裝入一個類時,該類被放 在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本台計算機上的所有類都在同一地址空間內,而所有從外 部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入扒橘戚 了運行程序需要的所有類後,解釋器便可確定整個可執行程序的內存布局。解釋器為符號引用同特定的地址空間建立對應關系及查詢表。通過在這一階段確定代碼的 內存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問。
Ⅲ java為什麼要編譯
因為java的跨平台特性,java所謂的一次編譯,到處運行,關鍵就是在於java的虛擬機,也就是jvm,jvm只認識位元組碼,所以你寫好的java代碼就需要編譯成位元組碼才能在jvm上運行。其實不只是java需要編譯,C也需要編譯,機器本身並不能認識你寫的代碼,它們只認識0、1這樣的位元組碼,所以無論是你用什麼樣的語言編寫的代碼,要想最終在物理機器上運行,都要進行編譯。
Ⅳ 簡述JAVA程序的編輯編譯和運行過程
第一步(編譯): 創建完源文件之後,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點象make。
如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報「cant find symbol」的錯誤。
第二步(運行):java類運行的過程大概可分為兩個過程:1、類的載入 2、類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去載入該類。也就是說,JVM並不是在一開始就把一個程序就所有的類都載入到內存中,而是到不得不用的時候才把它載入進來,而且只載入一次。
特別說明:java類中所有public和protected的實例方法都採用動態綁定機制,所有私有方法、靜態方法、構造器及初始化方法<clinit>都是採用靜態綁定機制。而使用動態綁定機制的時候會用到方法表,靜態綁定時並不會用到。
(4)java內存編譯擴展閱讀:
Java整個編譯以及運行的過程相當繁瑣,本文通過一個簡單的程序來簡單的說明整個流程。
Java代碼編譯:是由Java源碼編譯器來完成;
Java位元組碼的執行:是由JVM執行引擎來完成
Java程序從源文件創建到程序運行要經過兩大步驟:
1、源文件由編譯器編譯成位元組碼(ByteCode)
2、位元組碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經過JVM的解釋運行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。
Ⅳ java編譯為什麼那麼慢
ecplipse編譯慢,並不是說編譯的工具慢,是由於工程代碼很多,導致內存短時間產生不夠的現象,表現出來的就是很慢。
很多程序在進行大數據的計算或者資料庫的操作,都需要很多的內存來計算或者保存數據,編譯環境這時候就會很卡。