導航:首頁 > 編程語言 > javaobjectboolean

javaobjectboolean

發布時間:2024-06-12 19:49:02

❶ 什麼是 java 虛擬機

您好,提問者:

Java虛擬機簡稱JVM,它的作用如下:

1、其實Java不可跨平台,真正實現跨平台的是JVM虛擬機。

2、JVM其實就是一個編譯java、運行class的一個跟操作系統的一個軟體。

3、JVM的作用只針對於Java,而系統中的東西與它無關。

4、其實說白了就是一個軟體,就像VMware一樣。

Java虛擬機


一、什麼是Java虛擬機


Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。


  1. 為什麼要使用Java虛擬機

Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機是實現這一特點的關鍵。一般的高級語言如果要在不同的平台上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機後,Java語言在不同平台上運行時不需要重新編譯。Java語言使用模式Java虛擬機屏蔽了與具體平台相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。Java虛擬機在執行位元組碼時,把位元組碼解釋成具體平台上的機器指令執行。


2.誰需要了解Java虛擬機


Java虛擬機是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助於理解Java語言的一些性質,也有助於使用Java語言。對於要在特定平台上實現Java虛擬機的軟體人員,Java語言的編譯器作者以及要用硬體晶元實現Java虛擬機的人來說,則必須深刻理解Java虛擬機的規范。另外,如果你想擴展Java語言,或是把其它語言編譯成Java語言的位元組碼,你也需要深入地了解Java虛擬機。


3.Java虛擬機支持的數據類型


Java虛擬機支持Java語言的基本數據類型如下:


byte://1位元組有符號整數的補碼

short://2位元組有符號整數的補碼

int://4位元組有符號整數的補碼

long://8位元組有符號整數的補碼

float://4位元組IEEE754單精度浮點數

double://8位元組IEEE754雙精度浮點數

char://2位元組無符號Unicode字元


幾乎所有的Java類型檢查都是在編譯時完成的。上面列出的原始數據類型的數據在Java執行時不需要用硬體標記。操作這些原始數據類型數據的位元組碼(指令)本身就已經指出了操作數的數據類型,例如iadd、ladd、fadd和dadd指令都是把兩個數相加,其操作數類型別是int、long、float和double。虛擬機沒有給boolean(布爾)類型設置單獨的指令。boolean型的數據是由integer指令,包括integer返回來處理的。boolean型的數組則是用byte數組來處理的。虛擬機使用IEEE754格式的浮點數。不支持IEEE格式的較舊的計算機,在運行Java數值計算程序時,可能會非常慢。


虛擬機支持的其它數據類型包括:

object//對一個Javaobject(對象)的4位元組引用

returnAddress//4位元組,用於jsr/ret/jsr-w/ret-w指令

注:Java數組被當作object處理。


虛擬機的規范對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數據。用Java虛擬機的位元組碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的位元組碼程序。Java虛擬機由於位元組碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把位元組碼轉換成64位的形式。從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平台無關性和可

移植性。


二、Java虛擬機體系結構


Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。


  1. Java指令集

Java虛擬機支持大約248個位元組碼。每個位元組碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當於Java程序的匯編語言。

Java指令集中的指令包含一個單位元組的操作符,用於指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅由一個單位元組的操作符構成。


虛擬機的內層循環的執行過程如下:


do{

取一個操作符位元組;

根據操作符的值執行一個動作;

}while(程序未結束)


由於指令系統的簡單性,使得虛擬機執行的過程十分簡單,從而有利於提高執行的效率。指令中操作數的數量和大小是由操作符決定的。如果操作數比一個位元組大,那麼它存儲的順序是高位位元組優先。例如,一個16位的參數存放時佔用兩個位元組,其值為:


第一個位元組*256+第二個位元組位元組碼指令流一般只是位元組對齊的。指令tabltch和lookup是例外,在這兩條指令內部要求強制的4位元組邊界對齊。


2.寄存器


Java虛擬機的寄存器用於保存機器的運行狀態,與微處理器中的某些專用寄存器類似。


Java虛擬機的寄存器有四種:

pc:Java程序計數器。

optop:指向操作數棧頂端的指針。

frame:指向當前執行方法的執行環境的指針。

vars:指向當前執行方法的局部變數區第一個變數的指針。


Java虛擬機


Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性(特別是對於寄存器數目不多的處理器)。

所有寄存器都是32位的。


3.棧


Java虛擬機的棧有三個區域:局部變數區、運行環境區、操作數區。


(1)局部變數區 每個Java方法使用一個固定大小的局部變數集。它們按照與vars寄存器的字偏移量來定址。局部變數都是32位的。長整數和雙精度浮點數占據了兩個局部變數的空間,卻按照第一個局部變數的索引來定址。(例如,一個具有索引n的局部變數,如果是一個雙精度浮點數,那麼它實際占據了索引n和n+1所代表的存儲空間。)虛擬機規范並不要求在局部變數中的64位的值是64位對齊的。虛擬機提供了把局部變數中的值裝載到操作數棧的指令,也提供了把操作數棧中的值寫入局部變數的指令。


(2)運行環境區 在運行環境中包含的信息用於動態鏈接,正常的方法返回以及異常傳播。


·動態鏈接

運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用於支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變數時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號,並把變數訪問翻譯成與這些變數運行時的存儲結構相應的偏移地址。動態鏈接方法和變數使得方法中使用的其它類的變化不會影響到本程序的代碼。


·正常的方法返回

如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。執行環境在正常返回的情況下用於恢復調用者的寄存器,並把調用者的程序計數器增加一個恰當的數值,以跳過已執行過的方法調用指令,然後在調用者的執行環境中繼續執行下去。


·異常和錯誤傳播

異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用


·程序使用了throw語句。

當異常發生時,Java虛擬機採取如下措施:

·檢查與當前方法相聯系的catch子句表。每個catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。

·與異常相匹配的catch子句應該符合下面的條件:造成異常的指令在其指令范圍之內,發生的異常類型是其能處理的異常類型的子類型。如果找到了匹配的catch子句,那麼系統轉移到指定的異常處理塊處執行;如果沒有找到異常處理塊,重復尋找匹配的catch子句的過程,直到當前方法的所有嵌套的catch子句都被檢查過。

·由於虛擬機從第一個匹配的catch子句處繼續執行,所以catch子句表中的順序是很重要的。因為Java代碼是結構化的,因此總可以把某個方法的所有的異常處理器都按序排列到一個表中,對任意可能的程序計數器的值,都可以用線性的順序找到合適的異常處理塊,以處理在該程序計數器值下發生的異常情況。

·如果找不到匹配的catch子句,那麼當前方法得到一個"未截獲異常"的結果並返回到當前方法的調用者,好像異常剛剛在其調用者中發生一樣。如果在調用者中仍然沒有找到相應的異常處理塊,那麼這種錯誤傳播將被繼續下去。如果錯誤被傳播到最頂層,那麼系統將調用一個預設的異常處理塊。

(3)操作數棧區 機器指令只從操作數棧中取操作數,對它們進行操作,並把結果返回到棧中。選擇棧結構的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。操作數棧是32位的。它用於給方法傳遞參數,並從方法接收結果,也用於支持操作的參數,並保存操作的結果。例如,iadd指令將兩個整數相加。相加的兩個整數應該是操作數棧頂的兩個字。這兩個字是由先前的指令壓進堆棧的。這兩個整數將從堆棧彈出、相加,並把結果壓回到操作數棧中。


每個原始數據類型都有專門的指令對它們進行必須的操作。每個操作數在棧中需要一個存儲位置,除了long和double型,它們需要兩個位置。操作數只能被適用於其類型的操作符所操作。例如,壓入兩個int類型的數,如果把它們當作是一個long類型的數則是非法的。在Sun的虛擬機實現中,這個限制由位元組碼驗證器強制實行。但是,有少數操作(操作符pe和swap),用於對運行時數據區進行操作時是不考慮類型的。


4.無用單元收集堆


Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集演算法,可以根據系統的需求使用各種各樣的演算法。


5.方法區


方法區與傳統語言中的編譯後代碼或是Unix進程中的正文段類似。它保存方法代碼(編譯後的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計劃在將來的版本中實現。每個類文件包含了一個Java類或一個Java界面的編譯後的代碼。可以說類文件是Java語言的執行代碼文件。為了保證類文件的平台無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范。

❷ 浠涔堝彨鉶氭嫙鏈猴紵

浠涔堟槸鉶氭嫙鏈猴紵

鉶氭嫙鏈虹殑姒傚康姣旇緝瀹芥硾錛岄氬父浜轟滑鎺ヨЕ鍒扮殑鉶氭嫙鏈烘傚康鏈塚Mware閭f牱鐨勭‖浠舵ā鎷熻蔣浠訛紝涔熸湁JVM榪欐牱鐨勪粙浜庣‖浠跺拰緙栬瘧紼嬪簭涔嬮棿鐨勮蔣浠躲傝繖閲屾墍鎸囩殑鏄鍚庤呫
鉶氭嫙鏈烘槸涓涓鎶借薄鐨勮$畻鏈猴紝鍜屽疄闄呯殑璁$畻鏈轟竴鏍鳳紝鍏鋒湁涓涓鎸囦護闆嗗苟浣跨敤涓嶅悓鐨勫瓨鍌ㄥ尯鍩熴傚畠璐熻矗鎵ц屾寚浠わ紝榪樿佺$悊鏁版嵁銆佸唴瀛樺拰瀵勫瓨鍣ㄣ傝繖鍙拌櫄鎷熺殑鏈哄櫒鍦ㄤ換浣曞鉤鍙頒笂閮芥彁渚涚粰緙栬瘧紼嬪簭涓涓鐨勫叡鍚岀殑鎺ュ彛銆傜紪璇戠▼搴忓彧闇瑕侀潰鍚戣櫄鎷熸満錛岀敓鎴愯櫄鎷熸満鑳藉熺悊瑙g殑浠g爜錛岀劧鍚庣敱瑙i噴鍣ㄦ潵灝嗚櫄鎷熸満浠g爜杞鎹涓虹壒瀹氱郴緇熺殑鏈哄櫒鐮佹墽琛屻

Java鉶氭嫙鏈

涓銆佷粈涔堟槸Java鉶氭嫙鏈

Java鉶氭嫙鏈烘槸涓涓鎯寵薄涓鐨勬満鍣,鍦ㄥ疄闄呯殑璁$畻鏈轟笂閫氳繃杞浠舵ā鎷熸潵瀹炵幇銆侸ava鉶氭嫙鏈烘湁鑷宸辨兂璞′腑鐨勭‖浠,濡傚勭悊鍣ㄣ佸爢鏍堛佸瘎瀛樺櫒絳,榪樺叿鏈夌浉搴旂殑鎸囦護緋葷粺銆

1.涓轟粈涔堣佷嬌鐢↗ava鉶氭嫙鏈

Java璇璦鐨勪竴涓闈炲父閲嶈佺殑鐗圭偣灝辨槸涓庡鉤鍙扮殑鏃犲叧鎬с傝屼嬌鐢↗ava鉶氭嫙鏈烘槸瀹炵幇榪欎竴鐗圭偣鐨勫叧閿銆備竴鑸鐨勯珮綰ц璦濡傛灉瑕佸湪涓嶅悓鐨勫鉤鍙頒笂榪愯,鑷沖皯闇瑕佺紪璇戞垚涓嶅悓鐨勭洰鏍囦唬鐮併傝屽紩鍏Java璇璦鉶氭嫙鏈哄悗,Java璇璦鍦ㄤ笉鍚屽鉤鍙頒笂榪愯屾椂涓嶉渶瑕侀噸鏂扮紪璇戙侸ava璇璦浣跨敤妯″紡Java鉶氭嫙鏈哄睆钄戒簡涓庡叿浣撳鉤鍙扮浉鍏崇殑淇℃伅,浣垮緱Java璇璦緙栬瘧紼嬪簭鍙闇鐢熸垚鍦↗ava鉶氭嫙鏈轟笂榪愯岀殑鐩鏍囦唬鐮(瀛楄妭鐮),灝卞彲浠ュ湪澶氱嶅鉤鍙頒笂涓嶅姞淇鏀瑰湴榪愯屻侸ava鉶氭嫙鏈哄湪鎵ц屽瓧鑺傜爜鏃,鎶婂瓧鑺傜爜瑙i噴鎴愬叿浣撳鉤鍙頒笂鐨勬満鍣ㄦ寚浠ゆ墽琛屻

2.璋侀渶瑕佷簡瑙Java鉶氭嫙鏈

Java鉶氭嫙鏈烘槸Java璇璦搴曞眰瀹炵幇鐨勫熀紜,瀵笿ava璇璦鎰熷叴瓚g殑浜洪兘搴斿笿ava鉶氭嫙鏈烘湁涓澶ф傜殑浜嗚В銆傝繖鏈夊姪浜庣悊瑙Java璇璦鐨勪竴浜涙ц川,涔熸湁鍔╀簬浣跨敤Java璇璦銆傚逛簬瑕佸湪鐗瑰畾騫沖彴涓婂疄鐜癑ava鉶氭嫙鏈虹殑杞浠朵漢鍛,Java璇璦鐨勭紪璇戝櫒浣滆呬互鍙婅佺敤紜浠惰姱鐗囧疄鐜癑ava鉶氭嫙鏈虹殑浜烘潵璇,鍒欏繀欏繪繁鍒葷悊瑙Java鉶氭嫙鏈虹殑瑙勮寖銆傚彟澶,濡傛灉浣犳兂鎵╁睍Java璇璦,鎴栨槸鎶婂叾瀹冭璦緙栬瘧鎴怞ava璇璦鐨勫瓧鑺傜爜,浣犱篃闇瑕佹繁鍏ュ湴浜嗚ВJava鉶氭嫙鏈恆

3.Java鉶氭嫙鏈烘敮鎸佺殑鏁版嵁綾誨瀷

Java鉶氭嫙鏈烘敮鎸丣ava璇璦鐨勫熀鏈鏁版嵁綾誨瀷濡備笅:

byte://1瀛楄妭鏈夌﹀彿鏁存暟鐨勮ˉ鐮
short://2瀛楄妭鏈夌﹀彿鏁存暟鐨勮ˉ鐮
int://4瀛楄妭鏈夌﹀彿鏁存暟鐨勮ˉ鐮
long://8瀛楄妭鏈夌﹀彿鏁存暟鐨勮ˉ鐮
float://4瀛楄妭IEEE754鍗曠簿搴︽誕鐐規暟
double://8瀛楄妭IEEE754鍙岀簿搴︽誕鐐規暟
char://2瀛楄妭鏃犵﹀彿Unicode瀛楃

鍑犱箮鎵鏈夌殑Java綾誨瀷媯鏌ラ兘鏄鍦ㄧ紪璇戞椂瀹屾垚鐨勩備笂闈㈠垪鍑虹殑鍘熷嬫暟鎹綾誨瀷鐨勬暟鎹鍦↗ava鎵ц屾椂涓嶉渶瑕佺敤紜浠舵爣璁般傛搷浣滆繖浜涘師濮嬫暟鎹綾誨瀷鏁版嵁鐨勫瓧鑺傜爜(鎸囦護)鏈韜灝卞凡緇忔寚鍑轟簡鎿嶄綔鏁扮殑鏁版嵁綾誨瀷,渚嬪俰add銆乴add銆乫add鍜宒add鎸囦護閮芥槸鎶婁袱涓鏁扮浉鍔,鍏舵搷浣滄暟綾誨瀷鍒鏄痠nt銆乴ong銆乫loat鍜宒ouble銆傝櫄鎷熸満娌℃湁緇檅oolean(甯冨皵)綾誨瀷璁劇疆鍗曠嫭鐨勬寚浠ゃ俠oolean鍨嬬殑鏁版嵁鏄鐢眎nteger鎸囦護,鍖呮嫭integer榪斿洖鏉ュ勭悊鐨勩俠oolean鍨嬬殑鏁扮粍鍒欐槸鐢╞yte鏁扮粍鏉ュ勭悊鐨勩傝櫄鎷熸満浣跨敤IEEE754鏍煎紡鐨勬誕鐐規暟銆備笉鏀鎸両EEE鏍煎紡鐨勮緝鏃х殑璁$畻鏈,鍦ㄨ繍琛孞ava鏁板艱$畻紼嬪簭鏃,鍙鑳戒細闈炲父鎱銆

鉶氭嫙鏈烘敮鎸佺殑鍏跺畠鏁版嵁綾誨瀷鍖呮嫭:
object//瀵逛竴涓狫avaobject(瀵硅薄)鐨4瀛楄妭寮曠敤
returnAddress//4瀛楄妭,鐢ㄤ簬jsr/ret/jsr-w/ret-w鎸囦護
娉:Java鏁扮粍琚褰撲綔object澶勭悊銆

鉶氭嫙鏈虹殑瑙勮寖瀵逛簬object鍐呴儴鐨勭粨鏋勬病鏈変換浣曠壒孌婄殑瑕佹眰銆傚湪Sun鍏鍙哥殑瀹炵幇涓,瀵篔bject鐨勫紩鐢ㄦ槸涓涓鍙ユ焺,鍏朵腑鍖呭惈涓瀵規寚閽:涓涓鎸囬拡鎸囧悜璇object鐨勬柟娉曡〃,鍙︿竴涓鎸囧悜璇object鐨勬暟鎹銆傜敤Java鉶氭嫙鏈虹殑瀛楄妭鐮佽〃紺虹殑紼嬪簭搴旇ラ伒瀹堢被鍨嬭勫畾銆侸ava鉶氭嫙鏈虹殑瀹炵幇搴旀嫆緇濇墽琛岃繚鍙嶄簡綾誨瀷瑙勫畾鐨勫瓧鑺傜爜紼嬪簭銆侸ava鉶氭嫙鏈虹敱浜庡瓧鑺傜爜瀹氫箟鐨勯檺鍒朵技涔庡彧鑳借繍琛屼簬32浣嶅湴鍧絀洪棿鐨勬満鍣ㄤ笂銆備絾鏄鍙浠ュ壋寤轟竴涓狫ava鉶氭嫙鏈,瀹冭嚜鍔ㄥ湴鎶婂瓧鑺傜爜杞鎹㈡垚64浣嶇殑褰㈠紡銆備粠Java鉶氭嫙鏈烘敮鎸佺殑鏁版嵁綾誨瀷鍙浠ョ湅鍑,Java瀵規暟鎹綾誨瀷鐨勫唴閮ㄦ牸寮忚繘琛屼簡涓ユ牸瑙勫畾,榪欐牱浣垮緱鍚勭岼ava鉶氭嫙鏈虹殑瀹炵幇瀵規暟鎹鐨勮В閲婃槸鐩稿悓鐨,浠庤屼繚璇佷簡Java鐨勪笌騫沖彴鏃犲叧鎬у拰鍙
縐繪嶆с

浜屻丣ava鉶氭嫙鏈轟綋緋葷粨鏋

Java鉶氭嫙鏈虹敱浜斾釜閮ㄥ垎緇勬垚:涓緇勬寚浠ら泦銆佷竴緇勫瘎瀛樺櫒銆佷竴涓鏍堛佷竴涓鏃犵敤鍗曞厓鏀墮泦鍫(Garbage-collected-heap)銆佷竴涓鏂規硶鍖哄煙銆傝繖浜旈儴鍒嗘槸Java鉶氭嫙鏈虹殑閫昏緫鎴愪喚,涓嶄緷璧栦換浣曞疄鐜版妧鏈鎴栫粍緇囨柟寮,浣嗗畠浠鐨勫姛鑳藉繀欏誨湪鐪熷疄鏈哄櫒涓婁互鏌愮嶆柟寮忓疄鐜般

1.Java鎸囦護闆

Java鉶氭嫙鏈烘敮鎸佸ぇ綰248涓瀛楄妭鐮併傛瘡涓瀛楄妭鐮佹墽琛屼竴縐嶅熀鏈鐨凜PU榪愮畻,渚嬪,鎶婁竴涓鏁存暟鍔犲埌瀵勫瓨鍣,瀛愮▼搴忚漿縐葷瓑銆侸ava鎸囦護闆嗙浉褰撲簬Java紼嬪簭鐨勬眹緙栬璦銆
Java鎸囦護闆嗕腑鐨勬寚浠ゅ寘鍚涓涓鍗曞瓧鑺傜殑鎿嶄綔絎,鐢ㄤ簬鎸囧畾瑕佹墽琛岀殑鎿嶄綔,榪樻湁0涓鎴栧氫釜鎿嶄綔鏁,鎻愪緵鎿嶄綔鎵闇鐨勫弬鏁版垨鏁版嵁銆傝稿氭寚浠ゆ病鏈夋搷浣滄暟,浠呯敱涓涓鍗曞瓧鑺傜殑鎿嶄綔絎︽瀯鎴愩

鉶氭嫙鏈虹殑鍐呭眰寰鐜鐨勬墽琛岃繃紼嬪備笅:

do{
鍙栦竴涓鎿嶄綔絎﹀瓧鑺;
鏍規嵁鎿嶄綔絎︾殑鍊兼墽琛屼竴涓鍔ㄤ綔;
}while(紼嬪簭鏈緇撴潫)

鐢變簬鎸囦護緋葷粺鐨勭畝鍗曟,浣垮緱鉶氭嫙鏈烘墽琛岀殑榪囩▼鍗佸垎綆鍗,浠庤屾湁鍒╀簬鎻愰珮鎵ц岀殑鏁堢巼銆傛寚浠や腑鎿嶄綔鏁扮殑鏁伴噺鍜屽ぇ灝忔槸鐢辨搷浣滅﹀喅瀹氱殑銆傚傛灉鎿嶄綔鏁版瘮涓涓瀛楄妭澶,閭d箞瀹冨瓨鍌ㄧ殑欏哄簭鏄楂樹綅瀛楄妭浼樺厛銆備緥濡,涓涓16浣嶇殑鍙傛暟瀛樻斁鏃跺崰鐢ㄤ袱涓瀛楄妭,鍏跺間負:

絎涓涓瀛楄妭*256+絎浜屼釜瀛楄妭瀛楄妭鐮佹寚浠ゆ祦涓鑸鍙鏄瀛楄妭瀵歸綈鐨勩傛寚浠tabltch鍜宭ookup鏄渚嬪,鍦ㄨ繖涓ゆ潯鎸囦護鍐呴儴瑕佹眰寮哄埗鐨4瀛楄妭杈圭晫瀵歸綈銆

2.瀵勫瓨鍣

Java鉶氭嫙鏈虹殑瀵勫瓨鍣ㄧ敤浜庝繚瀛樻満鍣ㄧ殑榪愯岀姸鎬,涓庡井澶勭悊鍣ㄤ腑鐨勬煇浜涗笓鐢ㄥ瘎瀛樺櫒綾諱技銆

Java鉶氭嫙鏈虹殑瀵勫瓨鍣ㄦ湁鍥涚:
pc:Java紼嬪簭璁℃暟鍣ㄣ
optop:鎸囧悜鎿嶄綔鏁版爤欏剁鐨勬寚閽堛
frame:鎸囧悜褰撳墠鎵ц屾柟娉曠殑鎵ц岀幆澧冪殑鎸囬拡銆
vars:鎸囧悜褰撳墠鎵ц屾柟娉曠殑灞閮ㄥ彉閲忓尯絎涓涓鍙橀噺鐨勬寚閽堛

Java鉶氭嫙鏈

Java鉶氭嫙鏈烘槸鏍堝紡鐨,瀹冧笉瀹氫箟鎴栦嬌鐢ㄥ瘎瀛樺櫒鏉ヤ紶閫掓垨鎺ュ彈鍙傛暟,鍏剁洰鐨勬槸涓轟簡淇濊瘉鎸囦護闆嗙殑綆媧佹у拰瀹炵幇鏃剁殑楂樻晥鎬(鐗瑰埆鏄瀵逛簬瀵勫瓨鍣ㄦ暟鐩涓嶅氱殑澶勭悊鍣)銆
鎵鏈夊瘎瀛樺櫒閮芥槸32浣嶇殑銆

3.鏍

Java鉶氭嫙鏈虹殑鏍堟湁涓変釜鍖哄煙:灞閮ㄥ彉閲忓尯銆佽繍琛岀幆澧冨尯銆佹搷浣滄暟鍖恆

(1)灞閮ㄥ彉閲忓尯 姣忎釜Java鏂規硶浣跨敤涓涓鍥哄畾澶у皬鐨勫矓閮ㄥ彉閲忛泦銆傚畠浠鎸夌収涓巚ars瀵勫瓨鍣ㄧ殑瀛楀嚲縐婚噺鏉ュ誨潃銆傚矓閮ㄥ彉閲忛兘鏄32浣嶇殑銆傞暱鏁存暟鍜屽弻綺懼害嫻鐐規暟鍗犳嵁浜嗕袱涓灞閮ㄥ彉閲忕殑絀洪棿,鍗存寜鐓х涓涓灞閮ㄥ彉閲忕殑緔㈠紩鏉ュ誨潃銆(渚嬪,涓涓鍏鋒湁緔㈠紩n鐨勫矓閮ㄥ彉閲,濡傛灉鏄涓涓鍙岀簿搴︽誕鐐規暟,閭d箞瀹冨疄闄呭崰鎹浜嗙儲寮昻鍜宯+1鎵浠h〃鐨勫瓨鍌ㄧ┖闂淬)鉶氭嫙鏈鴻勮寖騫朵笉瑕佹眰鍦ㄥ矓閮ㄥ彉閲忎腑鐨64浣嶇殑鍊兼槸64浣嶅歸綈鐨勩傝櫄鎷熸満鎻愪緵浜嗘妸灞閮ㄥ彉閲忎腑鐨勫艱呰澆鍒版搷浣滄暟鏍堢殑鎸囦護,涔熸彁渚涗簡鎶婃搷浣滄暟鏍堜腑鐨勫煎啓鍏ュ矓閮ㄥ彉閲忕殑鎸囦護銆

(2)榪愯岀幆澧冨尯 鍦ㄨ繍琛岀幆澧冧腑鍖呭惈鐨勪俊鎮鐢ㄤ簬鍔ㄦ侀摼鎺,姝e父鐨勬柟娉曡繑鍥炰互鍙婂紓甯鎬紶鎾銆

路鍔ㄦ侀摼鎺
榪愯岀幆澧冨寘鎷瀵規寚鍚戝綋鍓嶇被鍜屽綋鍓嶆柟娉曠殑瑙i噴鍣ㄧ﹀彿琛ㄧ殑鎸囬拡,鐢ㄤ簬鏀鎸佹柟娉曚唬鐮佺殑鍔ㄦ侀摼鎺ャ傛柟娉曠殑class鏂囦歡浠g爜鍦ㄥ紩鐢ㄨ佽皟鐢ㄧ殑鏂規硶鍜岃佽塊棶鐨勫彉閲忔椂浣跨敤絎﹀彿銆傚姩鎬侀摼鎺ユ妸絎﹀彿褰㈠紡鐨勬柟娉曡皟鐢ㄧ炕璇戞垚瀹為檯鏂規硶璋冪敤,瑁呰澆蹇呰佺殑綾諱互瑙i噴榪樻病鏈夊畾涔夌殑絎﹀彿,騫舵妸鍙橀噺璁塊棶緲昏瘧鎴愪笌榪欎簺鍙橀噺榪愯屾椂鐨勫瓨鍌ㄧ粨鏋勭浉搴旂殑鍋忕Щ鍦板潃銆傚姩鎬侀摼鎺ユ柟娉曞拰鍙橀噺浣垮緱鏂規硶涓浣跨敤鐨勫叾瀹冪被鐨勫彉鍖栦笉浼氬獎鍝嶅埌鏈紼嬪簭鐨勪唬鐮併

路姝e父鐨勬柟娉曡繑鍥
濡傛灉褰撳墠鏂規硶姝e父鍦扮粨鏉熶簡,鍦ㄦ墽琛屼簡涓鏉″叿鏈夋g『綾誨瀷鐨勮繑鍥炴寚浠ゆ椂,璋冪敤鐨勬柟娉曚細寰楀埌涓涓榪斿洖鍊箋傛墽琛岀幆澧冨湪姝e父榪斿洖鐨勬儏鍐典笅鐢ㄤ簬鎮㈠嶈皟鐢ㄨ呯殑瀵勫瓨鍣,騫舵妸璋冪敤鑰呯殑紼嬪簭璁℃暟鍣ㄥ炲姞涓涓鎮板綋鐨勬暟鍊,浠ヨ煩榪囧凡鎵ц岃繃鐨勬柟娉曡皟鐢ㄦ寚浠,鐒跺悗鍦ㄨ皟鐢ㄨ呯殑鎵ц岀幆澧冧腑緇х畫鎵ц屼笅鍘匯

路寮傚父鍜岄敊璇浼犳挱
寮傚父鎯呭喌鍦↗ava涓琚縐頒綔Error(閿欒)鎴朎xception(寮傚父),鏄疶hrowable綾葷殑瀛愮被,鍦ㄧ▼搴忎腑鐨勫師鍥犳槸:鈶犲姩鎬侀摼鎺ラ敊,濡傛棤娉曟壘鍒版墍闇鐨刢lass鏂囦歡銆傗憽榪愯屾椂閿,濡傚逛竴涓絀烘寚閽堢殑寮曠敤

路紼嬪簭浣跨敤浜唗hrow璇鍙ャ
褰撳紓甯稿彂鐢熸椂,Java鉶氭嫙鏈洪噰鍙栧備笅鎺鏂:
路媯鏌ヤ笌褰撳墠鏂規硶鐩歌仈緋葷殑catch瀛愬彞琛ㄣ傛瘡涓猚atch瀛愬彞鍖呭惈鍏舵湁鏁堟寚浠よ寖鍥,鑳藉熷勭悊鐨勫紓甯哥被鍨,浠ュ強澶勭悊寮傚父鐨勪唬鐮佸潡鍦板潃銆
路涓庡紓甯哥浉鍖歸厤鐨刢atch瀛愬彞搴旇ョ﹀悎涓嬮潰鐨勬潯浠:閫犳垚寮傚父鐨勬寚浠ゅ湪鍏舵寚浠よ寖鍥翠箣鍐,鍙戠敓鐨勫紓甯哥被鍨嬫槸鍏惰兘澶勭悊鐨勫紓甯哥被鍨嬬殑瀛愮被鍨嬨傚傛灉鎵懼埌浜嗗尮閰嶇殑catch瀛愬彞,閭d箞緋葷粺杞縐誨埌鎸囧畾鐨勫紓甯稿勭悊鍧楀勬墽琛;濡傛灉娌℃湁鎵懼埌寮傚父澶勭悊鍧,閲嶅嶅繪壘鍖歸厤鐨刢atch瀛愬彞鐨勮繃紼,鐩村埌褰撳墠鏂規硶鐨勬墍鏈夊祵濂楃殑catch瀛愬彞閮借媯鏌ヨ繃銆
路鐢變簬鉶氭嫙鏈轟粠絎涓涓鍖歸厤鐨刢atch瀛愬彞澶勭戶緇鎵ц,鎵浠catch瀛愬彞琛ㄤ腑鐨勯『搴忔槸寰堥噸瑕佺殑銆傚洜涓篔ava浠g爜鏄緇撴瀯鍖栫殑,鍥犳ゆ誨彲浠ユ妸鏌愪釜鏂規硶鐨勬墍鏈夌殑寮傚父澶勭悊鍣ㄩ兘鎸夊簭鎺掑垪鍒頒竴涓琛ㄤ腑,瀵逛換鎰忓彲鑳界殑紼嬪簭璁℃暟鍣ㄧ殑鍊,閮藉彲浠ョ敤綰挎х殑欏哄簭鎵懼埌鍚堥傜殑寮傚父澶勭悊鍧,浠ュ勭悊鍦ㄨョ▼搴忚℃暟鍣ㄥ間笅鍙戠敓鐨勫紓甯告儏鍐點
路濡傛灉鎵句笉鍒板尮閰嶇殑catch瀛愬彞,閭d箞褰撳墠鏂規硶寰楀埌涓涓"鏈鎴鑾峰紓甯"鐨勭粨鏋滃苟榪斿洖鍒板綋鍓嶆柟娉曠殑璋冪敤鑰,濂藉儚寮傚父鍒氬垰鍦ㄥ叾璋冪敤鑰呬腑鍙戠敓涓鏍楓傚傛灉鍦ㄨ皟鐢ㄨ呬腑浠嶇劧娌℃湁鎵懼埌鐩稿簲鐨勫紓甯稿勭悊鍧,閭d箞榪欑嶉敊璇浼犳挱灝嗚緇х畫涓嬪幓銆傚傛灉閿欒琚浼犳挱鍒版渶欏跺眰,閭d箞緋葷粺灝嗚皟鐢ㄤ竴涓緙虹渷鐨勫紓甯稿勭悊鍧椼
(3)鎿嶄綔鏁版爤鍖 鏈哄櫒鎸囦護鍙浠庢搷浣滄暟鏍堜腑鍙栨搷浣滄暟,瀵瑰畠浠榪涜屾搷浣,騫舵妸緇撴灉榪斿洖鍒版爤涓銆傞夋嫨鏍堢粨鏋勭殑鍘熷洜鏄:鍦ㄥ彧鏈夊皯閲忓瘎瀛樺櫒鎴栭潪閫氱敤瀵勫瓨鍣ㄧ殑鏈哄櫒(濡侷ntel486)涓,涔熻兘澶熼珮鏁堝湴妯℃嫙鉶氭嫙鏈虹殑琛屼負銆傛搷浣滄暟鏍堟槸32浣嶇殑銆傚畠鐢ㄤ簬緇欐柟娉曚紶閫掑弬鏁,騫朵粠鏂規硶鎺ユ敹緇撴灉,涔熺敤浜庢敮鎸佹搷浣滅殑鍙傛暟,騫朵繚瀛樻搷浣滅殑緇撴灉銆備緥濡,iadd鎸囦護灝嗕袱涓鏁存暟鐩稿姞銆傜浉鍔犵殑涓や釜鏁存暟搴旇ユ槸鎿嶄綔鏁版爤欏剁殑涓や釜瀛椼傝繖涓や釜瀛楁槸鐢卞厛鍓嶇殑鎸囦護鍘嬭繘鍫嗘爤鐨勩傝繖涓や釜鏁存暟灝嗕粠鍫嗘爤寮瑰嚭銆佺浉鍔,騫舵妸緇撴灉鍘嬪洖鍒版搷浣滄暟鏍堜腑銆

姣忎釜鍘熷嬫暟鎹綾誨瀷閮芥湁涓撻棬鐨勬寚浠ゅ瑰畠浠榪涜屽繀欏葷殑鎿嶄綔銆傛瘡涓鎿嶄綔鏁板湪鏍堜腑闇瑕佷竴涓瀛樺偍浣嶇疆,闄や簡long鍜宒ouble鍨,瀹冧滑闇瑕佷袱涓浣嶇疆銆傛搷浣滄暟鍙鑳借閫傜敤浜庡叾綾誨瀷鐨勬搷浣滅︽墍鎿嶄綔銆備緥濡,鍘嬪叆涓や釜int綾誨瀷鐨勬暟,濡傛灉鎶婂畠浠褰撲綔鏄涓涓猯ong綾誨瀷鐨勬暟鍒欐槸闈炴硶鐨勩傚湪Sun鐨勮櫄鎷熸満瀹炵幇涓,榪欎釜闄愬埗鐢卞瓧鑺傜爜楠岃瘉鍣ㄥ己鍒跺疄琛屻備絾鏄,鏈夊皯鏁版搷浣(鎿嶄綔絎pe鍜宻wap),鐢ㄤ簬瀵硅繍琛屾椂鏁版嵁鍖鴻繘琛屾搷浣滄椂鏄涓嶈冭檻綾誨瀷鐨勩

4.鏃犵敤鍗曞厓鏀墮泦鍫

Java鐨勫爢鏄涓涓榪愯屾椂鏁版嵁鍖,綾葷殑瀹炰緥(瀵硅薄)浠庝腑鍒嗛厤絀洪棿銆侸ava璇璦鍏鋒湁鏃犵敤鍗曞厓鏀墮泦鑳藉姏:瀹冧笉緇欑▼搴忓憳鏄懼紡閲婃斁瀵硅薄鐨勮兘鍔涖侸ava涓嶈勫畾鍏蜂綋浣跨敤鐨勬棤鐢ㄥ崟鍏冩敹闆嗙畻娉,鍙浠ユ牴鎹緋葷粺鐨勯渶奼備嬌鐢ㄥ悇縐嶅悇鏍風殑綆楁硶銆

5.鏂規硶鍖

鏂規硶鍖轟笌浼犵粺璇璦涓鐨勭紪璇戝悗浠g爜鎴栨槸Unix榪涚▼涓鐨勬f枃孌電被浼箋傚畠淇濆瓨鏂規硶浠g爜(緙栬瘧鍚庣殑java浠g爜)鍜岀﹀彿琛ㄣ傚湪褰撳墠鐨凧ava瀹炵幇涓,鏂規硶浠g爜涓嶅寘鎷鍦ㄦ棤鐢ㄥ崟鍏冩敹闆嗗爢涓,浣嗚″垝鍦ㄥ皢鏉ョ殑鐗堟湰涓瀹炵幇銆傛瘡涓綾繪枃浠跺寘鍚浜嗕竴涓狫ava綾繪垨涓涓狫ava鐣岄潰鐨勭紪璇戝悗鐨勪唬鐮併傚彲浠ヨ寸被鏂囦歡鏄疛ava璇璦鐨勬墽琛屼唬鐮佹枃浠躲備負浜嗕繚璇佺被鏂囦歡鐨勫鉤鍙版棤鍏蟲,Java鉶氭嫙鏈鴻勮寖涓瀵圭被鏂囦歡鐨勬牸寮忎篃浣滀簡璇︾粏鐨勮存槑銆傚叾鍏蜂綋緇嗚妭璇峰弬鑰僑un鍏鍙哥殑Java鉶氭嫙鏈鴻勮寖銆

❸ 如何用maven將java8寫的代碼編譯為java6平台的

在一般的Java應用開發過程中,開發人員使用Java的方式比較簡單。打開慣用的IDE,編寫Java源代碼,再利用IDE提供的功能直接運行Java 程序就可以了。這種開發模式背後的過程是:開發人員編寫的是Java源代碼文件(.java),IDE會負責調用Java的編譯器把Java源代碼編譯成平台無關的位元組代碼(byte code),以類文件的形式保存在磁碟上(.class)。Java虛擬機(JVM)會負責把Java位元組代碼載入並執行。Java通過這種方式來實現其「編寫一次,到處運行(Write once, run anywhere)」 的目標。Java類文件中包含的位元組代碼可以被不同平台上的JVM所使用。Java位元組代碼不僅可以以文件形式存在於磁碟上,也可以通過網路方式來下載,還可以只存在於內存中。JVM中的類載入器會負責從包含位元組代碼的位元組數組(byte[])中定義出Java類。在某些情況下,可能會需要動態的生成 Java位元組代碼,或是對已有的Java位元組代碼進行修改。這個時候就需要用到本文中將要介紹的相關技術。首先介紹一下如何動態編譯Java源文件。
動態編譯Java源文件
在一般情況下,開發人員都是在程序運行之前就編寫完成了全部的Java源代碼並且成功編譯。對有些應用來說,Java源代碼的內容在運行時刻才能確定。這個時候就需要動態編譯源代碼來生成Java位元組代碼,再由JVM來載入執行。典型的場景是很多演算法競賽的在線評測系統(如PKU JudgeOnline),允許用戶上傳Java代碼,由系統在後台編譯、運行並進行判定。在動態編譯Java源文件時,使用的做法是直接在程序中調用Java編譯器。
JSR 199引入了Java編譯器API。如果使用JDK 6的話,可以通過此API來動態編譯Java代碼。比如下面的代碼用來動態編譯最簡單的Hello World類。該Java類的代碼是保存在一個字元串中的。
01 public class CompilerTest {
02 public static void main(String[] args) throws Exception {
03 String source = "public class Main { public static void main(String[] args) {System.out.println(\"Hello World!\");} }";
04 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
05 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);
07 Iterable< extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);
08 CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);
09 boolean result = task.call();
10 if (result) {
11 System.out.println("編譯成功。");
12 }
13 }
14
15 static class StringSourceJavaObject extends SimpleJavaFileObject {
16
17 private String content = null;
18 public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {
19 super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
20 this.content = content;
21 }
22
23 public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {
24 return content;
25 }
26 }
27 }
如果不能使用JDK 6提供的Java編譯器API的話,可以使用JDK中的工具類com.sun.tools.javac.Main,不過該工具類只能編譯存放在磁碟上的文件,類似於直接使用javac命令
另外一個可用的工具是Eclipse JDT Core提供的編譯器。這是Eclipse Java開發環境使用的增量式Java編譯器,支持運行和調試有錯誤的代碼。該編譯器也可以單獨使用。Play框架在內部使用了JDT的編譯器來動態編譯Java源代碼。在開發模式下,Play框架會定期掃描項目中的Java源代碼文件,一旦發現有修改,會自動編譯 Java源代碼。因此在修改代碼之後,刷新頁面就可以看到變化。使用這些動態編譯的方式的時候,需要確保JDK中的tools.jar在應用的 CLASSPATH中。
下面介紹一個例子,是關於如何在Java裡面做四則運算,比如求出來(3+4)*7-10的值。一般的做法是分析輸入的運算表達式,自己來模擬計算過程。考慮到括弧的存在和運算符的優先順序等問題,這樣的計算過程會比較復雜,而且容易出錯。另外一種做法是可以用JSR 223引入的腳本語言支持,直接把輸入的表達式當做JavaScript或是JavaFX腳本來執行,得到結果。下面的代碼使用的做法是動態生成Java源代碼並編譯,接著載入Java類來執行並獲取結果。這種做法完全使用Java來實現。
01 private static double calculate(String expr) throws CalculationException {
02 String className = "CalculatorMain";
03 String methodName = "calculate";
04 String source = "public class " + className
05 + " { public static double " + methodName + "() { return " + expr +"; } }";
06 //省略動態編譯Java源代碼的相關代碼,參見上一節
07 boolean result = task.call();
08 if (result) {
09 ClassLoader loader = Calculator.class.getClassLoader();
10 try {
11 Class<?> clazz = loader.loadClass(className);
12 Method method = clazz.getMethod(methodName, new Class<?>[] {});
13 Object value = method.invoke(null, new Object[] {});
14 return (Double) value;
15 } catch (Exception e) {
16 throw new CalculationException("內部錯誤。");
17 }
18 } else {
19 throw new CalculationException("錯誤的表達式。");
20 }
21 }
上面的代碼給出了使用動態生成的Java位元組代碼的基本模式,即通過類載入器來載入位元組代碼,創建Java類的對象的實例,再通過Java反射API來調用對象中的方法。
Java位元組代碼增強
Java 位元組代碼增強指的是在Java位元組代碼生成之後,對其進行修改,增強其功能。這種做法相當於對應用程序的二進制文件進行修改。在很多Java框架中都可以見到這種實現方式。Java位元組代碼增強通常與Java源文件中的註解(annotation)一塊使用。註解在Java源代碼中聲明了需要增強的行為及相關的元數據,由框架在運行時刻完成對位元組代碼的增強。Java位元組代碼增強應用的場景比較多,一般都集中在減少冗餘代碼和對開發人員屏蔽底層的實現細節上。用過JavaBeans的人可能對其中那些必須添加的getter/setter方法感到很繁瑣,並且難以維護。而通過位元組代碼增強,開發人員只需要聲明Bean中的屬性即可,getter/setter方法可以通過修改位元組代碼來自動添加。用過JPA的人,在調試程序的時候,會發現實體類中被添加了一些額外的 域和方法。這些域和方法是在運行時刻由JPA的實現動態添加的。位元組代碼增強在面向方面編程(AOP)的一些實現中也有使用。

❹ 求解 java動態編譯找不到類,往各位大蝦指導

參照網上其他童鞋的例子與介紹,修改了一下:
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

/**
* 動態編譯Java 源文件
*
* @author shenshouer
*
*/
public class CompilerTest {

public static void main(String[] args) throws Exception {
String source = "public class Main { " + "public static void main(String[]args) {"
+ "System.out.println(\"Hello World!\");" + "} " + "}";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
StringSourceJavaObject sourceObject = new CompilerTest.StringSourceJavaObject("Main",
source);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);

// 獲取編譯類根路徑,不然會報找不到類的錯誤
String path = Class.class.getClass().getResource("/").getPath();
Iterable< String> options = Arrays.asList("-d", path);

// 增加options參數
// CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);
CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);

boolean result = task.call();

if (result) {
System.out.println("編譯成功。");

ClassLoader loader = CompilerTest.class.getClassLoader();
try {
Class<?> clazz = loader.loadClass("Main");
Method method = clazz.getMethod("main", String[].class);
// 修改調用參數,不然會報參數個數不對
// Object value = method.invoke(null, new Object[] {});
Object value = method.invoke(null, new Object[] {new String[]{}});
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}

static class StringSourceJavaObject extends SimpleJavaFileObject {

private String content = null;

public StringSourceJavaObject(String name, String content) throws URISyntaxException {
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension),
Kind.SOURCE);
this.content = content;
}

public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return content;
}
}
}

❺ java中,負責對位元組代碼解釋執行的是

java中負責對位元組代碼解釋執行的是虛擬機,虛擬機將得到的位元組代碼進行編碼運行。
java程序,是先把java源程序通過javac命令編譯成位元組碼文件,然後再用java命令解釋執行。把位元組碼文件復制到其它計算機上,只要有java虛擬機就可以用java命令來執行。

閱讀全文

與javaobjectboolean相關的資料

熱點內容
安卓手機拍攝慢動作怎麼設置 瀏覽:480
中國程序員加油 瀏覽:172
python去哪個城市比較多 瀏覽:759
閃迪u盤加密初始密碼 瀏覽:773
房屋辦理解壓需要契稅和發票嗎 瀏覽:888
麗江易學java高級程序員 瀏覽:661
程序員木蘭教程 瀏覽:665
pythontkinter按鈕 瀏覽:439
如何快捷錄音安卓 瀏覽:7
sd播放音樂需要哪些文件夾 瀏覽:839
華為平板m3怎麼升級到安卓11 瀏覽:532
聯通app排隊號怎麼看 瀏覽:647
怎麼不越獄安裝app 瀏覽:183
python怎麼用鏈表 瀏覽:851
8k程序員面試題 瀏覽:541
貴州交警app怎麼下載 瀏覽:414
解壓縮安裝包怎麼安裝 瀏覽:44
壓縮機系統與裝置 瀏覽:677
上海大眾app怎麼查保養記錄 瀏覽:464
抖音網紅一手資源解壓密碼 瀏覽:543