未找到 .class 文件中的字符串文字以进行串联操作

String literals in .class file not found for concatenation operation

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

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

我的 jdk 是 1.8 并且“Tech”字符串 (#31) 存在于 Constant pool of classFile

Classfile /D:/work/sentinel-1.8.0/Sentinel-1.8.0/rpc/rpc-consumer/target/test-classes/com/cpic/zuoqi/rpc/api/Test.class
  Last modified 2020-10-10; size 656 bytes
  MD5 checksum 23cf1e4d4960807b50ebc6e180f895ab
  Compiled from "Test.java"
public class com.cpic.zuoqi.rpc.api.Test
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #11.#25        // java/lang/Object."<init>":()V
   #2 = Class              #26            // java/lang/String
   #3 = String             #27            // ABC
   #4 = Methodref          #2.#28         // java/lang/String."<init>":(Ljava/lang/String;)V
   #5 = Class              #29            // java/lang/StringBuilder
   #6 = Methodref          #5.#25         // java/lang/StringBuilder."<init>":()V
   #7 = Methodref          #5.#30         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   #8 = String             #31            // Tech
   #9 = Methodref          #5.#32         // java/lang/StringBuilder.toString:()Ljava/lang/String;
  #10 = Class              #33            // com/cpic/zuoqi/rpc/api/Test
  #11 = Class              #34            // java/lang/Object
  #12 = Utf8               <init>
  #13 = Utf8               ()V
  #14 = Utf8               Code
  #15 = Utf8               LineNumberTable
  #16 = Utf8               LocalVariableTable
  #17 = Utf8               this
  #18 = Utf8               Lcom/cpic/zuoqi/rpc/api/Test;
  #19 = Utf8               test
  #20 = Utf8               s1
  #21 = Utf8               Ljava/lang/String;
  #22 = Utf8               s2
  #23 = Utf8               SourceFile
  #24 = Utf8               Test.java
  #25 = NameAndType        #12:#13        // "<init>":()V
  #26 = Utf8               java/lang/String
  #27 = Utf8               ABC
  #28 = NameAndType        #12:#35        // "<init>":(Ljava/lang/String;)V
  #29 = Utf8               java/lang/StringBuilder
  #30 = NameAndType        #36:#37        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #31 = Utf8               Tech
  #32 = NameAndType        #38:#39        // toString:()Ljava/lang/String;
  #33 = Utf8               com/cpic/zuoqi/rpc/api/Test
  #34 = Utf8               java/lang/Object
  #35 = Utf8               (Ljava/lang/String;)V
  #36 = Utf8               append
  #37 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #38 = Utf8               toString
  #39 = Utf8               ()Ljava/lang/String;
{
  public com.cpic.zuoqi.rpc.api.Test();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/cpic/zuoqi/rpc/api/Test;

  void test();
    descriptor: ()V
    flags:
    Code:
      stack=3, locals=3, args_size=1
         0: new           #2                  // class java/lang/String
         3: dup
         4: ldc           #3                  // String ABC
         6: invokespecial #4                  // Method java/lang/String."<init>":(Ljava/lang/String;)V
         9: astore_1
        10: new           #5                  // class java/lang/StringBuilder
        13: dup
        14: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
        17: aload_1
        18: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        21: ldc           #8                  // String Tech
        23: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        26: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        29: astore_2
        30: return
      LineNumberTable:
        line 5: 0
        line 6: 10
        line 7: 30
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      31     0  this   Lcom/cpic/zuoqi/rpc/api/Test;
           10      21     1    s1   Ljava/lang/String;
           30       1     2    s2   Ljava/lang/String;
}
SourceFile: "Test.java"