国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 通過字節碼看java中this的隱式傳參詳解

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

2021-06-10 15:31等你歸去來 Java教程

這篇文章主要給大家介紹了關于如何通過字節碼看java中this的隱式傳參的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

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

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

概述

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
 }
}

反匯編命令:

?
1
javap -verbose hello.class

反匯編結果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
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_super
constant 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, 然后再做相關操作!

總結:

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

原文鏈接:http://www.cnblogs.com/yougewe/p/9929249.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久久 | 国产精品永久免费视频 | 亚洲视频中文字幕 | 亚洲日韩中文字幕一区 | 日韩中文字幕 | 偷拍一区二区三区 | 欧美极品一区二区 | 久久99精品久久久久久久青青日本 | 91精品综合久久久久久五月天 | 日韩欧美一区二区三区在线观看 | 黄色av免费| 在线播放国产一区二区三区 | 午夜国产视频 | 国产成人一区二区啪在线观看 | 久久亚洲国产精品 | 亚洲热综合 | 最新中文字幕 | www.四虎.com | 精品视频在线观看 | 国产精品久久久久久亚洲调教 | 性视频网站免费 | 九九综合九九 | 日本大人吃奶视频xxxx | 亚洲欧美日韩精品久久亚洲区 | 国产日韩精品一区二区 | 中文字幕乱码亚洲精品一区 | 免费在线观看毛片 | 精品在线| 精品综合 | 天堂v在线视频 | 亚洲日本欧美日韩高观看 | 午夜视频在线 | 亚洲一区中文字幕 | 国产一区二区高清在线 | 91 在线观看| 污视频免费网站 | 国产人妖一区二区 | 特黄特色大片免费视频观看 | 精品中文字幕一区 | 日韩在线中文字幕 | 伊人色爱|