欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java字節(jié)碼的知識點有哪些

這篇文章主要為大家展示了“Java字節(jié)碼的知識點有哪些”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java字節(jié)碼的知識點有哪些”這篇文章吧。

成都創(chuàng)新互聯(lián)公司是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),微信平臺小程序開發(fā),十余年建站對護欄打樁機等多個行業(yè),擁有豐富的網(wǎng)站營銷經(jīng)驗。

編譯“1+1”代碼

首先我們需要寫個簡單的小程序,1+1的程序,學(xué)習(xí)就要從最簡單的1+1開始,代碼如下:

package top.luozhou.test;/**
 * @description:
 * @author: luozhou
 * @create: 2019-12-25 21:28
 **/public class TestJava {    
     public static void main(String[] args) {
         int a=1+1;
        System.out.println(a);
    }
}

寫好java類文件后,首先執(zhí)行命令javac TestJava.java 編譯類文件,生成TestJava.class。 然后執(zhí)行反編譯命令javap -verbose TestJava,字節(jié)碼結(jié)果顯示如下:

  Compiled from "TestJava.java"public class top.luozhou.test.TestJava
  minor version: 0
  major version: 56
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #5.#14         // java/lang/Object."<init>":()V
   #2 = Fieldref           #15.#16        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = Methodref          #17.#18        // java/io/PrintStream.println:(I)V
   #4 = Class              #19            // top/luozhou/test/TestJava
   #5 = Class              #20            // java/lang/Object
   #6 = Utf8               <init>
   #7 = Utf8               ()V
   #8 = Utf8               Code
   #9 = Utf8               LineNumberTable
  #10 = Utf8               main
  #11 = Utf8               ([Ljava/lang/String;)V
  #12 = Utf8               SourceFile
  #13 = Utf8               TestJava.java
  #14 = NameAndType        #6:#7          // "<init>":()V
  #15 = Class              #21            // java/lang/System
  #16 = NameAndType        #22:#23        // out:Ljava/io/PrintStream;
  #17 = Class              #24            // java/io/PrintStream
  #18 = NameAndType        #25:#26        // println:(I)V
  #19 = Utf8               top/luozhou/test/TestJava
  #20 = Utf8               java/lang/Object
  #21 = Utf8               java/lang/System
  #22 = Utf8               out
  #23 = Utf8               Ljava/io/PrintStream;
  #24 = Utf8               java/io/PrintStream
  #25 = Utf8               println
  #26 = Utf8               (I)V
{  public top.luozhou.test.TestJava();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:      stack=1, locals=1, args_size=1
         0: aload_0         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 8: 0
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:      stack=2, locals=2, args_size=1
         0: iconst_2         1: istore_1         2: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         5: iload_1         6: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
         9: return
      LineNumberTable:
        line 10: 0
        line 11: 2
        line 12: 9}

解析字節(jié)碼

1.基礎(chǔ)信息

上述結(jié)果刪除了部分不影響解析的冗余信息,接下來我們便來解析字節(jié)碼的結(jié)果。

 minor version: 0 次版本號,為0表示未使用
 major version: 56 主版本號,56表示jdk12,表示只能運行在jdk12版本以及之后的虛擬機中
flags: ACC_PUBLIC, ACC_SUPER

ACC_PUBLIC:這就是一個是否是public類型的訪問標(biāo)志。

ACC_SUPER: 這個falg是為了解決通過 invokespecial 指令調(diào)用 super 方法的問題??梢詫⑺斫獬?Java 1.0.2 的一個缺陷補丁,只有通過這樣它才能正確找到 super 類方法。從 Java 1.0.2 開始,編譯器始終會在字節(jié)碼中生成 ACC_SUPER 訪問標(biāo)識。感興趣的同學(xué)可以點擊這里來了解更多。

2.常量池

接下來,我們將要分析常量池,你也可以對照上面整體的字節(jié)碼來理解。

#1 = Methodref          #5.#14         // java/lang/Object."<init>":()V

這是一個方法引用,這里的#5表示索引值,然后我們可以發(fā)現(xiàn)索引值為5的字節(jié)碼如下

#5 = Class              #20            // java/lang/Object

它表示這是一個Object類,同理#14指向的是一個"<init>":()V表示引用的是初始化方法。

#2 = Fieldref           #15.#16        // java/lang/System.out:Ljava/io/PrintStream;

上面這段表示是一個字段引用,同樣引用了#15和#16,實際上引用的就是java/lang/System類中的PrintStream對象。其他的常量池分析思路是一樣的,鑒于篇幅我就不一一說明了,只列下其中的幾個關(guān)鍵類型和信息。

NameAndType:這個表示是名稱和類型的常量表,可以指向方法名稱或者字段的索引,在上面的字節(jié)碼中都是表示的實際的方法。

Utf8:我們經(jīng)常使用的是字符編碼,但是這個不是只有字符編碼的意思,它表示一種字符編碼是Utf8的字符串。它是虛擬機中最常用的表結(jié)構(gòu),你可以理解為它可以描述方法,字段,類等信息。 比如:

#4 = Class              #19 #19 = Utf8               top/luozhou/test/TestJava

這里表示#4這個索引下是一個類,然后指向的類是#19,#19是一個Utf8表,最終存放的是top/luozhou/test/TestJava,那么這樣一連接起來就可以知道#4位置引用的類是top/luozhou/test/TestJava了。

3.構(gòu)造方法信息

接下來,我們分析下構(gòu)造方法的字節(jié)碼,我們知道,一個類初始化的時候最先執(zhí)行它的構(gòu)造方法,如果你沒有寫構(gòu)造方法,系統(tǒng)會默認給你添加一個無參的構(gòu)造方法。

public top.luozhou.test.TestJava();    
    descriptor: ()V    flags: ACC_PUBLIC    Code:      stack=1, locals=1, args_size=1
         0: aload_0         
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return      LineNumberTable:
        line 8: 0

descriptor: ()V :表示這是一個沒有返回值的方法。

flags: ACC_PUBLIC:是公共方法。

stack=1, locals=1, args_size=1 :表示棧中的數(shù)量為1,局部變量表中的變量為1,調(diào)用參數(shù)也為1。

這里為什么都是1呢?這不是默認的構(gòu)造方法嗎?哪來的參數(shù)?其實Java語言有一個潛規(guī)則:在任何實例方法里面都可以通過this來訪問到此方法所屬的對象。而這種機制的實現(xiàn)就是通過Java編譯器在編譯的時候作為入?yún)魅氲椒椒ㄖ辛?,熟悉python語言的同學(xué)肯定會知道,在python中定義一個方法總會傳入一個self的參數(shù),這也是傳入此實例的引用到方法內(nèi)部,Java只是把這種機制后推到編譯階段完成而已。所以,這里的1都是指this這個參數(shù)而已。

         0: aload_0         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
    LineNumberTable:        line 8: 0

經(jīng)過上面這個分析對于這個構(gòu)造方法表達的意思也就很清晰了。

aload_0:表示把局部變量表中的第一個變量加載到棧中,也就是this。

invokespecial:直接調(diào)用初始化方法。

return:調(diào)用完畢方法結(jié)束。

LineNumberTable:這是一個行數(shù)的表,用來記錄字節(jié)碼的偏移量和代碼行數(shù)的映射關(guān)系。line 8: 0表示,源碼中第8行對應(yīng)的就是偏移量0的字節(jié)碼,因為是默認的構(gòu)造方法,所以這里并無法直觀體現(xiàn)出來。

另外這里會執(zhí)行Object的構(gòu)造方法是因為,Object是所有類的父類,子類的構(gòu)造要先構(gòu)造父類的構(gòu)造方法。

4.main方法信息

public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: iconst_2         1: istore_1         2: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         5: iload_1         6: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
         9: return
      LineNumberTable:        line 10: 0
        line 11: 2
        line 12: 9

有了之前構(gòu)造方法的分析,我們接下來分析main方法也會熟悉很多,重復(fù)的我就略過了,這里重點分析code部分。

stack=2, locals=2, args_size=1:這里的棧和局部變量表為2,參數(shù)還是為1。這是為什么呢?因為main方法中聲明了一個變量a,所以局部變量表要加一個,棧也是,所以他們是2。那為什么args_size還是1呢?你不是說默認會把this傳入的嗎?應(yīng)該是2啊。注意:之前說的是在任何實例方法中,而這個main方法是一個靜態(tài)方法,靜態(tài)方法直接可以通過類+方法名訪問,并不需要實例對象,所以這里就沒必要傳入了。

0: iconst_2:將int類型2推送到棧頂。

1: istore_1:將棧頂int類型數(shù)值存入第二個本地變量。

2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;:獲取PrintStream類。

5: iload_1: 把第二個int型本地變量推送到棧頂。

6: invokevirtual #3 // Method java/io/PrintStream.println:(I)V:調(diào)用println方法。

9: return:調(diào)用完畢結(jié)束方法。

這里的LineNumberTable是有源碼的,我們可以對照下我前面描述是否正確:

Java字節(jié)碼的知識點有哪些

line 10: 0: 第10行表示 0: iconst_2字節(jié)碼,這里我們發(fā)現(xiàn)編譯器直接給我們計算好了把2推送到棧頂了。

line 11: 2:第11行源碼對應(yīng)的是 2: getstatic 獲取輸出的靜態(tài)類PrintStream。

line 12: 9:12行源碼對應(yīng)的是return,表示方法結(jié)束。

這里我也畫了一個動態(tài)圖片來演示main方法執(zhí)行的過程,希望能夠幫助你理解:

Java字節(jié)碼的知識點有哪些

以上是“Java字節(jié)碼的知識點有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站欄目:Java字節(jié)碼的知識點有哪些
瀏覽地址:http://aaarwkj.com/article16/igihdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、動態(tài)網(wǎng)站ChatGPT、做網(wǎng)站、云服務(wù)器、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
日本特黄特色三级在线观看| 夜夜春国产精品不卡一区二区| 萌白的所有视频在线观看| 一区二区三区毛片观看| 国产精品高清呻吟久久久| 亚洲欧美国产成人在线| 久久综合亚洲鲁鲁五月天| 免费无码不卡av一区二区| 欧美黄片网站免费观看| 成人大片在线免费观看视频| 亚洲日本欧美在线一区| 不卡的av中文字幕在线播放| 亚洲综合中文字幕久久网址| 在线免费观看91亚洲| 亚洲天堂av日韩在线| 欧美特黄在线免费观看| 国产精品日韩理论在线| 香蕉夜夜草草久久亚洲香蕉| 九九九热精品在线视频观看| 国产精品专区日产一区| 欧美成人精品欧美一级黄片| 97色伦综合在线欧美视频| 老司机午夜视频在线观看| 国产美女亚洲精品久久久| 欧美一区二区欧美精品| 青青草原成年人免费看| 国产精品国产三级区| 在线免费观看国产黄色av| 国产精品久久久久久爽| 国产一区在线视频无卡顿| 日本精品一区二区不卡| av在线亚洲网站区一| 免费毛片一区二区三区四区| 日韩欧美日日夜夜精品| 在线日韩中文字幕二区| 一区二区三区乱码国产在线| 国产一区二区三区百合| 人妻一本久道久久综合鬼色| 熟女肥臀一区二区三区| av剧情在线观看免费| 亚洲一区精品中文字幕|