![](/img/trans.png)
[英]java.sql.ResultSet.getString() returns string with extra characters
[英]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.