Java字节码中StringBuilder.append两种方法签名的差异问询
理清StringBuilder两个append方法的字节码签名差异
嘿,我来帮你把这两个字节码方法签名的差异讲明白,其实这就是Java里方法重载在字节码层面的直观体现,咱们拆解来看:
先搞懂字节码方法签名的规则
字节码里的方法签名格式是:类全限定名.方法名:(参数类型描述符列表)返回值类型描述符
这里要注意:括号里的是参数的字节码类型描述符,不同类型对应不同的缩写,和你之前误解的数组完全是两回事~
逐个拆解两个签名
1. java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
- 括号内的
Ljava/lang/String;:这是引用类型的描述符格式——以L开头,后跟类的全限定名,最后以;结尾,代表的是单个java.lang.String对象,不是字符串数组!
(如果是字符串数组,描述符会是[Ljava/lang/String;,多了一个[前缀,这才是数组的标识) - 整个签名对应的是我们熟悉的
StringBuilder append(String str)方法,接收一个String参数,返回StringBuilder实例(支持链式调用)
2. java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
- 括号内的
I:这是字节码里int基本类型的专属描述符缩写,对应Java中的int基本类型参数 - 这个签名对应的是重载的
StringBuilder append(int i)方法,接收int类型参数,同样返回StringBuilder实例
核心差异总结
这两个签名本质是StringBuilder类的两个重载方法,差异完全在参数类型:
- 前者接收
String引用类型参数 - 后者接收
int基本类型参数
你之前的误解是把「单个引用类型的描述符」和「数组类型的描述符」搞混了,记住数组描述符一定会带[前缀,而单个引用类型是L+类名+;的格式就好啦~
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

