日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM真香系列:.java文件到.class文件

發(fā)布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM真香系列:.java文件到.class文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
認識JVM

什么是JVM

JVM 全稱 Java Virtual Machine,也就是我們耳熟能詳?shù)?Java 虛擬機。它能識別 .class后綴的文件,并且能夠解析它的指令,最終調(diào)用操作系統(tǒng)上的函數(shù),完成我們想要的操作。

可能有部分小伙伴學習過C++,C++開發(fā)出來的程序,編譯成二進制文件后,就可以直接執(zhí)行了,操作系統(tǒng)是能夠識別的。

但是咱們開的的Java程序就不一樣了,使用javac命令編譯出來的的.class文件之后,操作系統(tǒng)是不能識別的,需要對應(yīng)JVM去做一個轉(zhuǎn)換后,操作系統(tǒng)才能識別。

我們?yōu)槭裁床荒芟?C++ 一樣,直接在操作系統(tǒng)上運行編譯后的二進制文件呢?而非要搞一個處于程序與操作系統(tǒng)中間層的虛擬機呢?

這就是 JVM的過人之處了。大家都知道,Java 是一門抽象程度特別高的語言,提供了自動內(nèi)存管理等一系列的特性。這些特性直接在操作系統(tǒng)上實現(xiàn)是不太可能的,所以就需要JVM 進行做一系列的轉(zhuǎn)換。

大家一開始學Java的時候,就知道有個Write Once, Run Everywhere。就是我們編寫了一個java文件經(jīng)過編譯成.class文件后,可以在各種系統(tǒng)中進行運行。

其實這里是有個前提的,我們需要在對應(yīng)操作系統(tǒng)中安裝對應(yīng)的JVM,然后我們的.class文件就能運行了。

比如:Windows操作系統(tǒng)有對應(yīng)的JDK安裝版本、Linux也有對應(yīng)的JDK安裝版本等。

認識JDK

Java Development Kit (JDK) 是Sun公司(已被Oracle收購)針對Java開發(fā)員的軟件開發(fā)工具包。自從Java推出以來,JDK已經(jīng)成為使用最廣泛的Java SDK(Software development kit)。

經(jīng)非官方調(diào)查,目前JDK8是使用者最多的版本。

JDK14將在4月和7月收到安全更新,然后由9月到期的非LTS版本的JDK 15取代。JDK14包括16項新功能,例如JDK Flight Recorder事件流,模式匹配和開關(guān)表達式等特征。

從JDK9之后,Oracle采用了新的發(fā)布周期:每6個月發(fā)布一個版本,每3年發(fā)布一個LTS版本。JDK14是繼JDK9之后發(fā)布的第四個版本, 該版本為非LTS版本,最新的LTS版本為JDK11。

下面是JDK版本情況

這個混個眼熟就行,隨時關(guān)注JDK版本更新和新特性。

官網(wǎng)地址:https://www.oracle.com/java/

關(guān)于JDK安裝這里就省略。

JDK、JRE、JVM的關(guān)系

上面已經(jīng)說過JDK和JVM的相關(guān)概念,

JRE全程Java Runtime Environment,是運行基于Java語言編寫的程序所不可缺少的運行環(huán)境。也是通過它,Java的開發(fā)者才得以將自己開發(fā)的程序發(fā)布到用戶手中,讓用戶使用。

三者到底是什么關(guān)系呢?

關(guān)于三者關(guān)系請看官網(wǎng)

https://docs.oracle.com/javase/8/docs/index.html

JDK中包含JRE,也包括JDK,而JRE也包括JDK。范圍關(guān)系:JDK>JRE>JVM

".java"文件到".class"文件

`javac`命令

編寫一個HelloWorld.java文件

內(nèi)容就是一個Java入門

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

打開CMD,進入當前目錄,使用命令

javac?HelloWorld.java

就編譯出HelloWorld.class


編譯過程

這個javac命令過程到底干了些什么呢?

javac背后大致做了這些操作

這個流程

1、詞法分析

讀取源代碼,一個字節(jié)一個字節(jié)的讀取,找出其中我們定義好的關(guān)鍵字(如Java中的if、else、for、while等關(guān)鍵詞,識別哪些if是合法的關(guān)鍵詞,哪些不是),這就是詞法分析器進行詞法分析的過程,其結(jié)果是從源代碼中找出規(guī)范化的Token流。

2、語法分析

通過語法分析器對詞法分析后Token流進行語法分析,這一步檢查這些關(guān)鍵字組合再一次是否符合Java語言規(guī)范(如在if后面是不是緊跟著一個布爾判斷表達式),詞法分析的結(jié)果是形成一個符合Java語言規(guī)范的抽象語法樹。

3、語義分析

通過語義分析器進行語義分析。語音分析主要是將一些難懂的、復(fù)雜的語法轉(zhuǎn)化成更加簡單的語法,結(jié)果形成最簡單的語法(如將foreach轉(zhuǎn)換成for循環(huán) ,好有注解等),最后形成一個注解過后的抽象語法樹,這個語法樹更為接近目標語言的語法規(guī)則。

4、生成字節(jié)碼

通過字節(jié)碼生產(chǎn)器生成字節(jié)碼,根據(jù)經(jīng)過注解的語法抽象樹生成字節(jié)碼,也就是將一個數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為另一個數(shù)據(jù)結(jié)構(gòu)。最后生成我們想要的.class文件。

使用十六進制查看class文件內(nèi)容

我只用的是Notepad++,選中文本→插件→Converter→ASCII->HEX

class文件的開頭就是

CAFEBABE

想要學習這里的十六進制的字節(jié)碼的含義可以參考

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html


javap查看class文件內(nèi)容

javap是 Java class文件分解器,可以反編譯(即對javac編譯的文件進行反編譯),也可以查看java編譯器生成的字節(jié)碼。

新建一個User.java源文件,經(jīng)過javac編譯后,生成User.classs。

package?com.tian.demo.test;public?class?User?{private?int?age?=?22;private?String?name?=?"tian";public?int?addAge()?{return?age?=?age?+?1;}public?static?void?main(String[]?args)?{} }

使用javap命令

javap?-v?User.class?>log.txt

打開log.txt

Classfile?/D:/workspace/new/demo/src/main/java/com/tian/demo/test/User.classLast?modified?2020-11-5;?size?441?bytesMD5?checksum?2fa72d3f53bd9f138e0bfae82aba67e3Compiled?from?"User.java" public?class?com.tian.demo.test.Userminor?version:?0major?version:?52flags:?ACC_PUBLIC,?ACC_SUPER Constant?pool:#1?=?Methodref??????????#6.#21?????????//?java/lang/Object."<init>":()V#2?=?Fieldref???????????#5.#22?????????//?com/tian/demo/test/User.age:I#3?=?String?????????????#23????????????//?tian#4?=?Fieldref???????????#5.#24?????????//?com/tian/demo/test/User.name:Ljava/lang/String;#5?=?Class??????????????#25????????????//?com/tian/demo/test/User#6?=?Class??????????????#26????????????//?java/lang/Object#7?=?Utf8???????????????age#8?=?Utf8???????????????I#9?=?Utf8???????????????name#10?=?Utf8???????????????Ljava/lang/String;#11?=?Utf8???????????????<init>#12?=?Utf8???????????????()V#13?=?Utf8???????????????Code#14?=?Utf8???????????????LineNumberTable#15?=?Utf8???????????????addAge#16?=?Utf8???????????????()I#17?=?Utf8???????????????main#18?=?Utf8???????????????([Ljava/lang/String;)V#19?=?Utf8???????????????SourceFile#20?=?Utf8???????????????User.java#21?=?NameAndType????????#11:#12????????//?"<init>":()V#22?=?NameAndType????????#7:#8??????????//?age:I#23?=?Utf8???????????????tian#24?=?NameAndType????????#9:#10?????????//?name:Ljava/lang/String;#25?=?Utf8???????????????com/tian/demo/test/User#26?=?Utf8???????????????java/lang/Object {public?com.tian.demo.test.User();descriptor:?()Vflags:?ACC_PUBLICCode:stack=2,?locals=1,?args_size=10:?aload_01:?invokespecial?#1??????????????????//?Method?java/lang/Object."<init>":()V4:?aload_05:?bipush????????227:?putfield??????#2??????????????????//?Field?age:I10:?aload_011:?ldc???????????#3??????????????????//?String?tian13:?putfield??????#4??????????????????//?Field?name:Ljava/lang/String;16:?returnLineNumberTable:line?3:?0line?4:?4line?5:?10public?int?addAge();descriptor:?()Iflags:?ACC_PUBLICCode:stack=3,?locals=1,?args_size=10:?aload_01:?aload_02:?getfield??????#2??????????????????//?Field?age:I5:?iconst_16:?iadd7:?dup_x18:?putfield??????#2??????????????????//?Field?age:I11:?ireturnLineNumberTable:line?8:?0public?static?void?main(java.lang.String[]);descriptor:?([Ljava/lang/String;)Vflags:?ACC_PUBLIC,?ACC_STATICCode:stack=0,?locals=1,?args_size=10:?returnLineNumberTable:line?13:?0 } SourceFile:?"User.java"

魔數(shù)與class文件版本
常量池
訪問標志
類索引、父類索引、接口索引
字段表集合
方法表集合
屬性表集合

然后JVM就可以讀取這個User.class文件進行解析等一系列的操作。

以上就是我們的Java文件到class文件。

IT技術(shù)分享社區(qū)

個人博客網(wǎng)站:https://programmerblog.xyz

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協(xié)助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎(chǔ)知識硬件:斷路器、接觸器、繼電器基礎(chǔ)知識

總結(jié)

以上是生活随笔為你收集整理的JVM真香系列:.java文件到.class文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。