在`.class`文件中找不到用于连接操作的字符串文字。

huangapple go评论104阅读模式
英文:

String literals in .class file not found for concatenation operation

问题

在进行连接操作之前,是否会在常量池中为 "Tech" 创建一个对象?
我知道对于第一个字符串会创建两个对象。一个在常量池中,另一个在堆区,s1 将引用到堆区的对象。
对于第二个字符串对象,s2 将引用堆区中的对象(连接结果)。
但问题是,是否会在常量池中为字符串 "Tech" 创建一个对象。
请注意,我在某处读到过,在代码中的所有字符串字面量都会在常量池中分配内存,这在编译阶段就会决定。要验证这一点,可以在 .class 文件中找到字符串字面量。但是在编译了下面的代码后,在 .class 文件中并没有找到 "Tech"。

  1. String s1 = new String("ABC");
  2. String s2 = s1 + "Tech";
英文:

Would it create an object in the constant pool for "Tech" before concatenating?
I know for the first String 2 objects would be created. One in the constant pool and another one in the heap area to which s1 would be referencing.
For the second String object, s2 would be referencing to the object(concatenation result) in the heap area.
But the question is, would an object for String "Tech" be created on the constant pool.
Please note I had read it somewhere that all string literals in the code are allocated memory in the constant pool and this is decided during the compilation phase itself. And to verify the same, the string literals can be found in the .class file. But after compiling the below code, "Tech" is not found in the .class file.

  1. String s1 = new String("ABC");
  2. String s2 = s1 + "Tech";

答案1

得分: 1

我的jdk版本是1.8,"Tech"字符串(#31)存在于类文件的常量池中。

  1. Classfile /D:/work/sentinel-1.8.0/Sentinel-1.8.0/rpc/rpc-consumer/target/test-classes/com/cpic/zuoqi/rpc/api/Test.class
  2. 最后修改时间 2020-10-10大小 656 字节
  3. MD5 校验和 23cf1e4d4960807b50ebc6e180f895ab
  4. 编译自 "Test.java"
  5. public class com.cpic.zuoqi.rpc.api.Test
  6. 次要版本号: 0
  7. 主要版本号: 52
  8. 标志: ACC_PUBLIC, ACC_SUPER
  9. 常量池
  10. #1 = Methodref #11.#25 // java/lang/Object."<init>":()V
  11. #2 = Class #26 // java/lang/String
  12. #3 = String #27 // ABC
  13. #4 = Methodref #2.#28 // java/lang/String."<init>":(Ljava/lang/String;)V
  14. #5 = Class #29 // java/lang/StringBuilder
  15. #6 = Methodref #5.#25 // java/lang/StringBuilder."<init>":()V
  16. #7 = Methodref #5.#30 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  17. #8 = String #31 // Tech
  18. #9 = Methodref #5.#32 // java/lang/StringBuilder.toString:()Ljava/lang/String;
  19. #10 = Class #33 // com/cpic/zuoqi/rpc/api/Test
  20. #11 = Class #34 // java/lang/Object
  21. #12 = Utf8 <init>
  22. #13 = Utf8 ()V
  23. #14 = Utf8 Code
  24. #15 = Utf8 LineNumberTable
  25. #16 = Utf8 LocalVariableTable
  26. #17 = Utf8 this
  27. #18 = Utf8 Lcom/cpic/zuoqi/rpc/api/Test;
  28. #19 = Utf8 test
  29. #20 = Utf8 s1
  30. #21 = Utf8 Ljava/lang/String;
  31. #22 = Utf8 s2
  32. #23 = Utf8 SourceFile
  33. #24 = Utf8 Test.java
  34. #25 = NameAndType #12:#13 // "<init>":()V
  35. #26 = Utf8 java/lang/String
  36. #27 = Utf8 ABC
  37. #28 = NameAndType #12:#35 // "<init>":(Ljava/lang/String;)V
  38. #29 = Utf8 java/lang/StringBuilder
  39. #30 = NameAndType #36:#37 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  40. #31 = Utf8 Tech
  41. #32 = NameAndType #38:#39 // toString:()Ljava/lang/String;
  42. #33 = Utf8 com/cpic/zuoqi/rpc/api/Test
  43. #34 = Utf8 java/lang/Object
  44. #35 = Utf8 (Ljava/lang/String;)V
  45. #36 = Utf8 append
  46. #37 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
  47. #38 = Utf8 toString
  48. #39 = Utf8 ()Ljava/lang/String;
  49. {
  50. public com.cpic.zuoqi.rpc.api.Test();
  51. 描述符: ()V
  52. 标志: ACC_PUBLIC
  53. Code:
  54. =1, 局部变量=1, 参数大小=1
  55. 0: aload_0
  56. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  57. 4: return
  58. LineNumberTable:
  59. line 3: 0
  60. LocalVariableTable:
  61. Start Length Slot Name Signature
  62. 0 5 0 this Lcom/cpic/zuoqi/rpc/api/Test;
  63. void test();
  64. 描述符: ()V
  65. 标志:
  66. Code:
  67. =3, 局部变量=3, 参数大小=1
  68. 0: new #2 // 类 java/lang/String
  69. 3: dup
  70. 4: ldc #3 // 字符串 ABC
  71. 6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
  72. 9: astore_1
  73. 10: new #5 // 类 java/lang/StringBuilder
  74. 13: dup
  75. 14: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
  76. 17: aload_1
  77. 18: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  78. 21: ldc #8 // 字符串 Tech
  79. 23: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  80. 26: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  81. 29: astore_2
  82. 30: return
  83. LineNumberTable:
  84. line 5: 0
  85. line 6: 10
  86. line 7: 30
  87. LocalVariableTable:
  88. Start Length Slot Name Signature
  89. 0 31 0 this Lcom/cpic/zuoqi/rpc/api/Test;
  90. 10 21 1 s1 Ljava/lang/String;
  91. 30 1 2 s2 Ljava/lang/String;
  92. }
  93. SourceFile: "Test.java"
英文:

My jdk is 1.8 and "Tech" string(#31) exsit in Constant pool of classFile

  1. Classfile /D:/work/sentinel-1.8.0/Sentinel-1.8.0/rpc/rpc-consumer/target/test-classes/com/cpic/zuoqi/rpc/api/Test.class
  2. Last modified 2020-10-10; size 656 bytes
  3. MD5 checksum 23cf1e4d4960807b50ebc6e180f895ab
  4. Compiled from &quot;Test.java&quot;
  5. public class com.cpic.zuoqi.rpc.api.Test
  6. minor version: 0
  7. major version: 52
  8. flags: ACC_PUBLIC, ACC_SUPER
  9. Constant pool:
  10. #1 = Methodref #11.#25 // java/lang/Object.&quot;&lt;init&gt;&quot;:()V
  11. #2 = Class #26 // java/lang/String
  12. #3 = String #27 // ABC
  13. #4 = Methodref #2.#28 // java/lang/String.&quot;&lt;init&gt;&quot;:(Ljava/lang/String;)V
  14. #5 = Class #29 // java/lang/StringBuilder
  15. #6 = Methodref #5.#25 // java/lang/StringBuilder.&quot;&lt;init&gt;&quot;:()V
  16. #7 = Methodref #5.#30 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  17. #8 = String #31 // Tech
  18. #9 = Methodref #5.#32 // java/lang/StringBuilder.toString:()Ljava/lang/String;
  19. #10 = Class #33 // com/cpic/zuoqi/rpc/api/Test
  20. #11 = Class #34 // java/lang/Object
  21. #12 = Utf8 &lt;init&gt;
  22. #13 = Utf8 ()V
  23. #14 = Utf8 Code
  24. #15 = Utf8 LineNumberTable
  25. #16 = Utf8 LocalVariableTable
  26. #17 = Utf8 this
  27. #18 = Utf8 Lcom/cpic/zuoqi/rpc/api/Test;
  28. #19 = Utf8 test
  29. #20 = Utf8 s1
  30. #21 = Utf8 Ljava/lang/String;
  31. #22 = Utf8 s2
  32. #23 = Utf8 SourceFile
  33. #24 = Utf8 Test.java
  34. #25 = NameAndType #12:#13 // &quot;&lt;init&gt;&quot;:()V
  35. #26 = Utf8 java/lang/String
  36. #27 = Utf8 ABC
  37. #28 = NameAndType #12:#35 // &quot;&lt;init&gt;&quot;:(Ljava/lang/String;)V
  38. #29 = Utf8 java/lang/StringBuilder
  39. #30 = NameAndType #36:#37 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  40. #31 = Utf8 Tech
  41. #32 = NameAndType #38:#39 // toString:()Ljava/lang/String;
  42. #33 = Utf8 com/cpic/zuoqi/rpc/api/Test
  43. #34 = Utf8 java/lang/Object
  44. #35 = Utf8 (Ljava/lang/String;)V
  45. #36 = Utf8 append
  46. #37 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
  47. #38 = Utf8 toString
  48. #39 = Utf8 ()Ljava/lang/String;
  49. {
  50. public com.cpic.zuoqi.rpc.api.Test();
  51. descriptor: ()V
  52. flags: ACC_PUBLIC
  53. Code:
  54. stack=1, locals=1, args_size=1
  55. 0: aload_0
  56. 1: invokespecial #1 // Method java/lang/Object.&quot;&lt;init&gt;&quot;:()V
  57. 4: return
  58. LineNumberTable:
  59. line 3: 0
  60. LocalVariableTable:
  61. Start Length Slot Name Signature
  62. 0 5 0 this Lcom/cpic/zuoqi/rpc/api/Test;
  63. void test();
  64. descriptor: ()V
  65. flags:
  66. Code:
  67. stack=3, locals=3, args_size=1
  68. 0: new #2 // class java/lang/String
  69. 3: dup
  70. 4: ldc #3 // String ABC
  71. 6: invokespecial #4 // Method java/lang/String.&quot;&lt;init&gt;&quot;:(Ljava/lang/String;)V
  72. 9: astore_1
  73. 10: new #5 // class java/lang/StringBuilder
  74. 13: dup
  75. 14: invokespecial #6 // Method java/lang/StringBuilder.&quot;&lt;init&gt;&quot;:()V
  76. 17: aload_1
  77. 18: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  78. 21: ldc #8 // String Tech
  79. 23: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  80. 26: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  81. 29: astore_2
  82. 30: return
  83. LineNumberTable:
  84. line 5: 0
  85. line 6: 10
  86. line 7: 30
  87. LocalVariableTable:
  88. Start Length Slot Name Signature
  89. 0 31 0 this Lcom/cpic/zuoqi/rpc/api/Test;
  90. 10 21 1 s1 Ljava/lang/String;
  91. 30 1 2 s2 Ljava/lang/String;
  92. }
  93. SourceFile: &quot;Test.java&quot;

huangapple
  • 本文由 发表于 2020年10月10日 15:56:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/64291243.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定