【问题标题】:Java byte code classes interpretationJava字节码类解释
【发布时间】:2018-10-08 20:47:08
【问题描述】:

我了解基本的 Java 字节码指令以及如何从常量池中引用字段。 但我无法理解这两行之间的差异:

java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;  

具体的区别是什么?
唯一的变化是括号之间的部分指定第一个字符串数组和第二个整数基元。
第一个似乎在开始时只被调用一次,而第二个在每个新条目时都被调用。

编辑:
这是实际关注的源代码。我用它来漂亮地打印一棵树。

System.out.println(String.format("%" + this.indent + "s", "") +  "├──── " + nodeToString(currNode));

其中 nodeToString 是返回 String 类型的方法。

感谢指教

【问题讨论】:

  • 你总是附加相同的字符串吗?
  • 为了清楚起见,我编辑了这个问题。我认为编译器使用 StringBuilder 作为优化,因为连接字符串无效。但我还是不明白这两行。
  • 第一个重载采用 String 而不是数组。 String 数组的类型签名将使用左括号:[Ljava.lang.String;
  • 感谢戴夫的精准。起初我没有发现括号指定了函数签名。现在我知道了:)

标签: java bytecode javap


【解决方案1】:

抱歉,我只是需要休息一晚。
括号中的字段应指示附加操作数的类型。
"%" 是字符串,ident 是整数。
谢谢@Angel Koh,你让我提出了精确的问题,它解决了所有问题。
对于感兴趣的人,这里有一个描述 2 个不同版本的 StringBuilder 的链接:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/StringBuilder.java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多