Java虛擬機和字節碼

在Java的世界有這樣一句名言:Write Once,Run AnyWhere(一次編寫,到處運行)

一、簡要

首先對開頭這句話進行解釋,用Java編程語言(當然也可以用Groovy、JRuby等語言)編寫的源文件,然後用對應的編譯器編譯成.class文件後,就可以在不同的平臺上運行,例如:Windows、Linux、Mac OS等。提供這種能力的平臺就是Java虛擬機以及運行在其上的字節碼,在Windows上安裝其對應的Java虛擬機版本後就可以直接運行字節碼文件,在Linux上安裝其對應的Java虛擬機版本後也可以直接運行字節碼文件。

二、Java虛擬機

能實現這種效果的原因,是由於Java虛擬機運行在平臺上,對下屏蔽了硬件底層的具體實現,對上提供了統一的接口。

如下就是Oracle公司爲各個平臺提供的Java虛擬機版本(以jre-8爲例):

三、字節碼

1、定義:.class文件是由十六進制的值組成,而JVM以兩個十六進制值(即一個字節)爲一組進行讀取,因此稱之爲字節碼

2、特性:JVM規範要求每一個字節碼文件都要由十部分按照固定的順序組成,整體結構如下圖所示

3、下面以Java編程語言的Test.java爲例:

package cn.yxz;

public class TestJava {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

編譯後用WinHex工具查看(也可以使用cmder,vim Test.clas,輸入:%!xxd並Enter),內容如下:

其中前四個字節:CA FE BA BE,稱爲魔數,它的唯一作用是用於確定這個文件是否爲一個能被Java虛擬機接受的Class文件。

4、除了Java語言外,還可以將使用Groovy語言編寫的源文件編譯成字節碼

首先安裝Groovy環境,參考文章:https://www.cnblogs.com/taoweizhong/p/10991434.html

然後編寫TestGroovy.groovy源文件,代碼如下:

class TestGroovy
{
    static void main(args)
    {

        def mygreeting = "Hello World"

        println mygreeting
    }
}

編譯後的TestGroovy.class文件部分內容如下:

總結:可以看出用java語言和Groovy語言編寫的源文件風格雖然不同,但是編譯後的字節碼格式其實是一致的,有點殊途同歸的感覺。

 

最後附上Java技術體系所包括的內容圖:

JDK:Java程序設計語言、JavaAPI類庫、Java虛擬機
JRE:JavaAPI類庫中的Java SE API子集、Java虛擬機

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章