簡體   English   中英

字符串由java.sql.ResultSet.getString()返回及其字節碼解釋

[英]string return by java.sql.ResultSet.getString() and its bytecode interpretation

考慮代碼中的兩行:

...
rs.next();  //rs is ResultSet interface.
rs.getString("name");
...

javap生成的字節代碼是:

...
35:  invokeinterface #9,  1; //InterfaceMethod java/sql/ResultSet.next:()Z
   40:  pop
   41:  aload   4
   43:  ldc     #10; //String name
   45:  invokeinterface #11,  2; //InterfaceMethod java/sql/ResultSet.getString:
(Ljava/lang/String;)Ljava/lang/String;
   50:  pop
   51:  aload_2
   52:  invokeinterface #12,  1; //InterfaceMethod java/sql/Connection.close:()V

 ...

我試圖解釋這個字節碼。

對於行rs.getString("name"); 字節碼從第43行到第51行開始。

1)在第45行,方法是INVOKED並且返回一個字符串對象,如Ljava / lang / String所示。這是正確的或者在這里,只有方法從常量池加載索引#11 TO STACK並在第50行執行? ?

2) rs.getString("name");返回的字符串對象在哪里rs.getString("name"); 謊言? 在堆棧或堆上,因為我認為aload_2正在堆棧上推送一些值。

其實在這里,我對以下內容感到困惑:

如果假設我有:

 ...
rs.next();
rs.getString("name");
rs.getString("name");
rs.getString("name");
rs.getString("name");
...10 more times...
...

並且都返回相同的名稱。 然后將有10個不同的字符串對象具有相同的值。因此它將是內存浪費,並且是使用intern()的情況。 但如果這些將在堆棧上,那么它仍將被視為內存浪費並需要實習生()???

3)我認為rs.getString("name");返回的字符串對象rs.getString("name"); 是不是一個實習字符串所以絕對不會在永久代存儲區?

調用的字節碼的相關部分

rs.getString("name")

41:  aload   4
43:  ldc     #10; //String name
45:  invokeinterface #11,  2; //InterfaceMethod java/sql/ResultSet.getString:(Ljava/lang/String;)Ljava/lang/String;
50:  pop

一次取一行操作碼:

41:  aload   4

將存儲在局部變量#4( rs )中的對象推送到堆棧上

43:  ldc     #10; //String name

將字符串常量"name"推入堆棧

45:  invokeinterface #11,  2; //InterfaceMethod java/sql/ResultSet.getString:(Ljava/lang/String;)Ljava/lang/String;

彈出堆棧中的前2項來調用接口方法java/sql/ResultSet.getString:(Ljava/lang/String;)Ljava/lang/String; 並將結果( Ljava/lang/String; )壓入堆棧。

50:  pop

然后將前一個方法的結果從堆棧中彈出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM