在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虛擬機