亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

通過字節碼看java中this的隱式傳參詳解

2024-07-14 08:42:47
字體:
來源:轉載
供稿:網友

前言

從java/224771.html">字節碼看java中 this 隱式傳參具體體現(和python中的self如出一轍,但是比python中藏得更深),也發現了 static 與 非 static 方法的區別所在!

static與非static方法都是存儲java的方法區。在static 方法中,沒有this引用,因此無法使用當前類中所定義的變量,而非static方法則會默認傳入this。

概述

  • this關鍵字,是一個隱式參數,另外一個隱式參數是super。
  • this用于方法里面,用于方法外面無意義。
  • this關鍵字一般用于set方法和構造方法中。

我們今天就從另一個角度來真實看一下這個答案吧!

來個例子,并將其反編譯為可視代碼:

public class Hello { private final int ii; public Hello(int a) {  ii = a; } public static void main(String[] args) throws Exception {  sayHelloStatic("ok"); } public void sayHello(String word) {  System.out.println("hello, " + word); } public static void sayHelloStatic(String word) {  System.out.println("static hello, " + word); }}

反匯編命令:

javap -verbose Hello.class

反匯編結果:

Classfile /D:/xx/target/classes/com/xx/api/Hello.class Last modified 2018-11-8; size 1069 bytes MD5 checksum 9d39cd9d4e95588a73c059a4e69f01e8 Compiled from "Hello.java"public class com.xx.api.Hello minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPERConstant pool: #1 = Methodref   #14.#38  // java/lang/Object."<init>":()V #2 = Fieldref   #13.#39  // com/xx/api/Hello.ii:I #3 = String    #40   // ok #4 = Methodref   #13.#41  // com/xx/api/Hello.sayHelloStatic:(Ljava/lang/String;)V #5 = Fieldref   #42.#43  // java/lang/System.out:Ljava/io/PrintStream; #6 = Class    #44   // java/lang/StringBuilder #7 = Methodref   #6.#38   // java/lang/StringBuilder."<init>":()V #8 = String    #45   // hello, #9 = Methodref   #6.#46   // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; #10 = Methodref   #6.#47   // java/lang/StringBuilder.toString:()Ljava/lang/String; #11 = Methodref   #48.#49  // java/io/PrintStream.println:(Ljava/lang/String;)V #12 = String    #50   // static hello, #13 = Class    #51   // com/xx/api/Hello #14 = Class    #52   // java/lang/Object #15 = Utf8    ii #16 = Utf8    I #17 = Utf8    <init> #18 = Utf8    (I)V #19 = Utf8    Code #20 = Utf8    LineNumberTable #21 = Utf8    LocalVariableTable #22 = Utf8    this #23 = Utf8    Lcom/xx/api/Hello; #24 = Utf8    a #25 = Utf8    main #26 = Utf8    ([Ljava/lang/String;)V #27 = Utf8    args #28 = Utf8    [Ljava/lang/String; #29 = Utf8    Exceptions #30 = Class    #53   // java/lang/Exception #31 = Utf8    sayHello #32 = Utf8    (Ljava/lang/String;)V #33 = Utf8    word #34 = Utf8    Ljava/lang/String; #35 = Utf8    sayHelloStatic #36 = Utf8    SourceFile #37 = Utf8    Hello.java #38 = NameAndType  #17:#54  // "<init>":()V #39 = NameAndType  #15:#16  // ii:I #40 = Utf8    ok #41 = NameAndType  #35:#32  // sayHelloStatic:(Ljava/lang/String;)V #42 = Class    #55   // java/lang/System #43 = NameAndType  #56:#57  // out:Ljava/io/PrintStream; #44 = Utf8    java/lang/StringBuilder #45 = Utf8    hello, #46 = NameAndType  #58:#59  // append:(Ljava/lang/String;)Ljava/lang/StringBuilder; #47 = NameAndType  #60:#61  // toString:()Ljava/lang/String; #48 = Class    #62   // java/io/PrintStream #49 = NameAndType  #63:#32  // println:(Ljava/lang/String;)V #50 = Utf8    static hello, #51 = Utf8    com/xx/api/Hello #52 = Utf8    java/lang/Object #53 = Utf8    java/lang/Exception #54 = Utf8    ()V #55 = Utf8    java/lang/System #56 = Utf8    out #57 = Utf8    Ljava/io/PrintStream; #58 = Utf8    append #59 = Utf8    (Ljava/lang/String;)Ljava/lang/StringBuilder; #60 = Utf8    toString #61 = Utf8    ()Ljava/lang/String; #62 = Utf8    java/io/PrintStream #63 = Utf8    println{ public com.xx.api.Hello(int); descriptor: (I)V flags: ACC_PUBLIC Code:  stack=2, locals=2, args_size=2   0: aload_0   1: invokespecial #1     // Method java/lang/Object."<init>":()V   4: aload_0   5: iload_1   6: putfield  #2     // Field ii:I   9: return  LineNumberTable:  line 14: 0  line 15: 4  line 16: 9  LocalVariableTable:  Start Length Slot Name Signature  10  0 this Lcom/xx/api/Hello;  10  1  a I public static void main(java.lang.String[]) throws java.lang.Exception; descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code:  stack=1, locals=1, args_size=1   0: ldc   #3     // String ok   2: invokestatic #4     // Method sayHelloStatic:(Ljava/lang/String;)V   5: return  LineNumberTable:  line 42: 0  line 45: 5  LocalVariableTable:  Start Length Slot Name Signature  6  0 args [Ljava/lang/String; Exceptions:  throws java.lang.Exception public void sayHello(java.lang.String); descriptor: (Ljava/lang/String;)V flags: ACC_PUBLIC Code:  stack=3, locals=2, args_size=2   0: getstatic  #5     // Field java/lang/System.out:Ljava/io/PrintStream;   3: new   #6     // class java/lang/StringBuilder   6: dup   7: invokespecial #7     // Method java/lang/StringBuilder."<init>":()V  10: ldc   #8     // String hello,  12: invokevirtual #9     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  15: aload_1  16: invokevirtual #9     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  19: invokevirtual #10     // Method java/lang/StringBuilder.toString:()Ljava/lang/String;  22: invokevirtual #11     // Method java/io/PrintStream.println:(Ljava/lang/String;)V  25: return  LineNumberTable:  line 48: 0  line 49: 25  LocalVariableTable:  Start Length Slot Name Signature  26  0 this Lcom/xx/api/Hello;  26  1 word Ljava/lang/String; public static void sayHelloStatic(java.lang.String); descriptor: (Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code:  stack=3, locals=1, args_size=1   0: getstatic  #5     // Field java/lang/System.out:Ljava/io/PrintStream;   3: new   #6     // class java/lang/StringBuilder   6: dup   7: invokespecial #7     // Method java/lang/StringBuilder."<init>":()V  10: ldc   #12     // String static hello,  12: invokevirtual #9     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  15: aload_0  16: invokevirtual #9     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  19: invokevirtual #10     // Method java/lang/StringBuilder.toString:()Ljava/lang/String;  22: invokevirtual #11     // Method java/io/PrintStream.println:(Ljava/lang/String;)V  25: return  LineNumberTable:  line 51: 0  line 52: 25  LocalVariableTable:  Start Length Slot Name Signature  26  0 word Ljava/lang/String;}SourceFile: "Hello.java"

我們從字節碼文件中可以看出來:

  sayHello(String word) 和 sayHelloStatic(String word) 都只有一個參數,但是在字節碼中:

    sayHello(String word) 中引用 word 時使用了 15: aload_1, 可以看出其加載的變量是在 slot1中,而 slot0中即保存了 this 。

    sayHelloStatic(String word) 中引用 word 時使用了 15: aload_0, 可以看出靜態方法中,直接將變量存在了 slot0中,因此無法使用 this 中的變量了。

當要操作當前類的變量或方法時,需要先 aload_0, 然后再做相關操作!

總結:

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品网址在线观看| 国产精自产拍久久久久久| 亚洲精品国产精品国自产观看浪潮| 欧美电影在线观看| 久久久女人电视剧免费播放下载| 国产不卡一区二区在线播放| 97在线观看视频国产| www.亚洲一区| 成人综合国产精品| 欧美午夜无遮挡| 欧美一级片在线播放| 国产网站欧美日韩免费精品在线观看| 日韩精品一二三四区| 日韩一区在线视频| www.精品av.com| 日韩av免费在线看| 亚洲国产婷婷香蕉久久久久久| 欧美国产亚洲精品久久久8v| 国产精品激情av电影在线观看| 国产一区二区三区免费视频| 91久久国产精品91久久性色| 中文字幕日韩免费视频| 国产欧美一区二区三区在线| 亚洲久久久久久久久久| 亚洲视频日韩精品| 欧美午夜激情小视频| 精品亚洲永久免费精品| 精品色蜜蜜精品视频在线观看| 亚洲福利视频久久| 国产精品露脸av在线| 九九精品在线播放| 日本久久久久久久久久久| 91久久精品国产91久久性色| 国产精品入口尤物| 国产精品久久久久久久一区探花| 国模精品视频一区二区| 欧美日韩不卡合集视频| 欧美午夜xxx| www.美女亚洲精品| 在线播放国产一区二区三区| 69av在线播放| 欧美黄色免费网站| 狠狠色狠狠色综合日日小说| 成人看片人aa| 国产国产精品人在线视| 91精品国产自产在线| 日韩欧美国产一区二区| 欧美日韩国产成人在线观看| 精品久久久一区二区| 日韩在线视频网| 欧美—级高清免费播放| 97免费在线视频| 韩国精品美女www爽爽爽视频| 91精品视频观看| 成人精品久久av网站| 欧美精品videos性欧美| 亚洲女在线观看| 日韩电影第一页| 81精品国产乱码久久久久久| 亚洲aa中文字幕| 欧美日本精品在线| 91干在线观看| 亚洲图片在线综合| 国产一区二中文字幕在线看| 91九色精品视频| 97高清免费视频| 亚洲乱码av中文一区二区| 亚洲成人动漫在线播放| 亚洲激情 国产| 成人黄色在线免费| 91av视频在线观看| 91精品久久久久久综合乱菊| 欧美日韩亚洲一区二区| 日韩一区视频在线| 亚洲免费福利视频| 91午夜在线播放| 欧美激情2020午夜免费观看| 亚洲成年人影院在线| 成人网址在线观看| 欧美特级www| 亚洲老头同性xxxxx| 欧美国产日本在线| 欧美激情在线狂野欧美精品| 亚洲成人久久久久| 一区二区三区动漫| 亚洲free性xxxx护士hd| 日韩毛片中文字幕| 欧美老少配视频| 欧美亚洲国产成人精品| 国产精品久久久久99| 色综合伊人色综合网站| 国产精品h在线观看| 亚洲欧洲国产一区| 欧美另类暴力丝袜| 亚洲天堂av女优| 亚洲国产精品嫩草影院久久| 亚洲国产毛片完整版| 亚洲国产精品嫩草影院久久| 中文字幕在线观看日韩| 日韩精品在线观看视频| 亚洲第一精品自拍| 国产主播在线一区| 国产精品一区二区久久久久| 国产在线98福利播放视频| 亚洲精品一区在线观看香蕉| 成人春色激情网| 欧美日韩国产成人在线| 在线观看国产精品91| 日本成人在线视频网址| 亚洲国产欧美一区二区三区同亚洲| 91国产美女在线观看| 欧美一二三视频| 26uuu另类亚洲欧美日本一| 成人黄色免费在线观看| 亚洲无限乱码一二三四麻| 国产精品美女网站| 国产精品成人免费电影| 亚洲一区二区自拍| 国内伊人久久久久久网站视频| 精品国产乱码久久久久酒店| 欧洲美女7788成人免费视频| 中文字幕日韩精品在线| 日韩精品中文字幕有码专区| 欧美日韩在线免费观看| 九九精品在线视频| 亚洲激情视频在线观看| 亚洲小视频在线| 久久69精品久久久久久国产越南| 亚洲最大在线视频| 亚洲人午夜精品| 日韩二区三区在线| 热re99久久精品国产66热| 国产精品电影网站| 性色av一区二区三区在线观看| 国产精品日韩专区| 黄色精品一区二区| 欧美日韩一区二区三区在线免费观看| 欧美大全免费观看电视剧大泉洋| 中文字幕日韩电影| 久久精品国产精品亚洲| 国产精品aaa| 亚洲a在线观看| 8x海外华人永久免费日韩内陆视频| 在线国产精品视频| 欧美激情视频一区二区三区不卡| 亚洲欧美国产一本综合首页| 欧美日韩亚洲精品一区二区三区| 国产精品中文字幕在线观看| 国产午夜一区二区| 欧美日韩国产丝袜另类| 美女精品视频一区| 欧美性色19p| 亚洲视频视频在线| 久久综合久久88| 青青久久av北条麻妃海外网| 精品在线欧美视频| 久久免费视频观看| 欧美乱人伦中文字幕在线| 久久久久久综合网天天| 久久久999国产| 97久久超碰福利国产精品…| 亚洲xxxxx电影| 欧美成人免费全部| 亚洲欧美另类中文字幕|