溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JVM真香系列之如何學習Java文件到.Class文件

發布時間:2021-10-23 17:53:55 來源:億速云 閱讀:143 作者:iii 欄目:編程語言

本篇內容主要講解“JVM真香系列之如何學習Java文件到.Class文件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JVM真香系列之如何學習Java文件到.Class文件”吧!

什么是JVM

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

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

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

我們為什么不能像 C++ 一樣,直接在操作系統上運行編譯后的二進制文件呢?而非要搞一個處于程序與操作系統中間層的虛擬機呢?

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

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

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

比如:Windows操作系統有對應的JDK安裝版本、Linux也有對應的JDK安裝版本等。

JVM真香系列之如何學習Java文件到.Class文件

認識JDK

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

經非官方調查,目前JDK8是使用者最多的版本。

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

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

下面是JDK版本情況

JVM真香系列之如何學習Java文件到.Class文件

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

官網地址:https://www.oracle.com/java/

關于JDK安裝這里就省略。

JDK、JRE、JVM的關系

上面已經說過JDK和JVM的相關概念,

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

三者到底是什么關系呢?

關于三者關系請看官網

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

JVM真香系列之如何學習Java文件到.Class文件

JDK中包含JRE,也包括JDK,而JRE也包括JDK。范圍關系:JDK>JRE>JVM

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

`javac`命令

編寫一個HelloWorld.java文件

JVM真香系列之如何學習Java文件到.Class文件

內容就是一個Java入門

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

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

javac HelloWorld.java

就編譯出HelloWorld.class

JVM真香系列之如何學習Java文件到.Class文件

JVM真香系列之如何學習Java文件到.Class文件

編譯過程

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

javac背后大致做了這些操作

JVM真香系列之如何學習Java文件到.Class文件

這個流程

JVM真香系列之如何學習Java文件到.Class文件

1、詞法分析

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

2、語法分析

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

3、語義分析

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

4、生成字節碼

通過字節碼生產器生成字節碼,根據經過注解的語法抽象樹生成字節碼,也就是將一個數據結構轉化為另一個數據結構。最后生成我們想要的.class文件。

使用十六進制查看class文件內容

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

JVM真香系列之如何學習Java文件到.Class文件 

class文件的開頭就是

CAFEBABE

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

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

javap查看class文件內容

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

新建一個User.java源文件,經過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) {      } }

 JVM真香系列之如何學習Java文件到.Class文件

使用javap命令

javap -v User.class >log.txt

打開log.txt

Classfile /D:/workspace/new/demo/src/main/java/com/tian/demo/test/User.class   Last modified 2020-11-5; size 441 bytes   MD5 checksum 2fa72d3f53bd9f138e0bfae82aba67e3   Compiled from "User.java" public class com.tian.demo.test.User   minor version: 0   major version: 52   flags: 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: ()V     flags: ACC_PUBLIC     Code:       stack=2, locals=1, args_size=1          0: aload_0          1: invokespecial #1                  // Method java/lang/Object."<init>":()V          4: aload_0          5: bipush        22          7: putfield      #2                  // Field age:I         10: aload_0         11: ldc           #3                  // String tian         13: putfield      #4                  // Field name:Ljava/lang/String;         16: return       LineNumberTable:         line 3: 0         line 4: 4         line 5: 10    public int addAge();     descriptor: ()I     flags: ACC_PUBLIC     Code:       stack=3, locals=1, args_size=1          0: aload_0          1: aload_0          2: getfield      #2                  // Field age:I          5: iconst_1          6: iadd          7: dup_x1          8: putfield      #2                  // Field age:I         11: ireturn       LineNumberTable:         line 8: 0    public static void main(java.lang.String[]);     descriptor: ([Ljava/lang/String;)V     flags: ACC_PUBLIC, ACC_STATIC     Code:       stack=0, locals=1, args_size=1          0: return       LineNumberTable:         line 13: 0 } SourceFile: "User.java"
  • 魔數與class文件版本

  • 常量池

  • 訪問標志

  • 類索引、父類索引、接口索引

  • 字段表集合

  • 方法表集合

  • 屬性表集合

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

JVM真香系列之如何學習Java文件到.Class文件

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

IT技術分享社區

個人博客網站:https://programmerblog.xyz認識JVM

什么是JVM

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

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

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

我們為什么不能像 C++ 一樣,直接在操作系統上運行編譯后的二進制文件呢?而非要搞一個處于程序與操作系統中間層的虛擬機呢?

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

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

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

比如:Windows操作系統有對應的JDK安裝版本、Linux也有對應的JDK安裝版本等。

JVM真香系列之如何學習Java文件到.Class文件

認識JDK

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

經非官方調查,目前JDK8是使用者最多的版本。

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

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

下面是JDK版本情況

JVM真香系列之如何學習Java文件到.Class文件

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

官網地址:https://www.oracle.com/java/

關于JDK安裝這里就省略。

JDK、JRE、JVM的關系

上面已經說過JDK和JVM的相關概念,

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

三者到底是什么關系呢?

關于三者關系請看官網

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

JVM真香系列之如何學習Java文件到.Class文件

JDK中包含JRE,也包括JDK,而JRE也包括JDK。范圍關系:JDK>JRE>JVM

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

`javac`命令

編寫一個HelloWorld.java文件

JVM真香系列之如何學習Java文件到.Class文件

內容就是一個Java入門

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

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

javac HelloWorld.java

就編譯出HelloWorld.class

JVM真香系列之如何學習Java文件到.Class文件

JVM真香系列之如何學習Java文件到.Class文件

編譯過程

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

javac背后大致做了這些操作

JVM真香系列之如何學習Java文件到.Class文件

這個流程

JVM真香系列之如何學習Java文件到.Class文件

1、詞法分析

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

2、語法分析

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

3、語義分析

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

4、生成字節碼

通過字節碼生產器生成字節碼,根據經過注解的語法抽象樹生成字節碼,也就是將一個數據結構轉化為另一個數據結構。最后生成我們想要的.class文件。

使用十六進制查看class文件內容

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

JVM真香系列之如何學習Java文件到.Class文件

class文件的開頭就是

CAFEBABE

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

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

javap查看class文件內容

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

新建一個User.java源文件,經過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) {      } }

 JVM真香系列之如何學習Java文件到.Class文件

使用javap命令

javap -v User.class >log.txt

打開log.txt

Classfile /D:/workspace/new/demo/src/main/java/com/tian/demo/test/User.class   Last modified 2020-11-5; size 441 bytes   MD5 checksum 2fa72d3f53bd9f138e0bfae82aba67e3   Compiled from "User.java" public class com.tian.demo.test.User   minor version: 0   major version: 52   flags: 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: ()V     flags: ACC_PUBLIC     Code:       stack=2, locals=1, args_size=1          0: aload_0          1: invokespecial #1                  // Method java/lang/Object."<init>":()V          4: aload_0          5: bipush        22          7: putfield      #2                  // Field age:I         10: aload_0         11: ldc           #3                  // String tian         13: putfield      #4                  // Field name:Ljava/lang/String;         16: return       LineNumberTable:         line 3: 0         line 4: 4         line 5: 10    public int addAge();     descriptor: ()I     flags: ACC_PUBLIC     Code:       stack=3, locals=1, args_size=1          0: aload_0          1: aload_0          2: getfield      #2                  // Field age:I          5: iconst_1          6: iadd          7: dup_x1          8: putfield      #2                  // Field age:I         11: ireturn       LineNumberTable:         line 8: 0    public static void main(java.lang.String[]);     descriptor: ([Ljava/lang/String;)V     flags: ACC_PUBLIC, ACC_STATIC     Code:       stack=0, locals=1, args_size=1          0: return       LineNumberTable:         line 13: 0 } SourceFile: "User.java"
  •  魔數與class文件版本

  • 常量池

  • 訪問標志

  • 類索引、父類索引、接口索引

  • 字段表集合

  • 方法表集合

  • 屬性表集合

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

JVM真香系列之如何學習Java文件到.Class文件

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

到此,相信大家對“JVM真香系列之如何學習Java文件到.Class文件”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女