java位元組碼-this分析
阿新 • • 發佈:2018-11-15
1.this我們用的非常多,但是沒有搞清楚為啥我們可以在例項方法中使用this。這裡我從java位元組碼的角度來分析this。
2.程式碼:
public class Test {
private static String hello(String hello){
return hello + "hello";
}
private String sayHello(String hello){
return hello + "hello";
}
}
(1)我們從sayHello方法表的區域性變量表中發現都一個this區域性變數,但是在hello()方法中就沒有區域性變數this。
(2)javap 檢視,我們發現引數大小2,區域性變數2,棧的深度2.
private java.lang.String sayHello(java.lang.String);
descriptor: (Ljava/lang/String;)Ljava/lang/String;
flags: ACC_PRIVATE
Code:
stack=2, locals=2, args_size=2
總結:
java的例項方法(非static),在其編譯後鎖生成的位元組碼中,方法的引數會比原始碼多一個this,而且在第一個引數位置的地方,這樣我們就可以通過this來訪問當前物件的方法和屬性。那也就是說區域性變量表中至少存在一個指向當前物件的區域性變數。該引數由執行時jvm想例項方法注入this引數。