javap后的一些问题

javaxiaobai 2008-12-15 10:46:14
public class S{
public static void main(String[] args){
StringBuilder sb=new StringBuilder("abc");
}
}

javap后

new #2; //class java/lang/StrinbBuilder
dup
ldc #3; //String abc
invokespecial #4; //Method java/lang/StringBuilder "<init>":(Ljava/lang/String;)V
astore_1
return


问题:
为什么要有dup,dup意思为:This pops the top single-word value off the operand stack, and then pushes that value twice - i.e. it makes an extra copy of the top item on the stack.
ldc后栈内都有那些元素
invokespecial是怎么进行的,简明说下
还有#2 #3都是啥意思
谢谢大家了
...全文
104 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
javaxiaobai 2008-12-15
  • 打赏
  • 举报
回复
原来这里"abc"成参数了,懂了.谢谢了
javaxiaobai 2008-12-15
  • 打赏
  • 举报
回复
ZangXT,高手呀,就是受你影响才看这东西的,哈哈.谢谢你了
ZangXT 2008-12-15
  • 打赏
  • 举报
回复
各种指令对栈的处理方式和影响请参考jvm规范,说的很清楚。
ZangXT 2008-12-15
  • 打赏
  • 举报
回复
#2 #3是常量池的索引。
你使用 javap -verbose
选项就可以看到常量池的信息了。
ZangXT 2008-12-15
  • 打赏
  • 举报
回复
dup是复制栈顶的引用。
new #2; //class java/lang/StrinbBuilder,通过new得到的StringBuilder类型的引用放在栈顶
dup    //复制一份,注意现在栈顶上的两个单元都是这个引用了。
ldc #3; //String abc 从常量池里获取String abc
invokespecial #4; //Method java/lang/StringBuilder " <init>":(Ljava/lang/String;)V  调用StringBuilder的构造方法,注意这里是用栈顶dup的引用来调用方法,上面加载的 “abc”作为参数。方法执行完之后,参数出栈。这时候栈顶还有一个StringBuilder的引用,供下面使用
astore_1 //把引用赋值给局部变量1。也就是源代码中的sb=操作。  
return

应该明白dup的作用了,一个是供调用构造方法使用,一个是供赋值使用。想想如果不用dup的话该如何处理?这是优化的结果。 
javaxiaobai 2008-12-15
  • 打赏
  • 举报
回复
熟悉Java Vitual Machine Specification,来看看吧
duoduo6153 2008-12-15
  • 打赏
  • 举报
回复
请查看Java Vitual Machine Specification
kao331431214 2008-12-15
  • 打赏
  • 举报
回复
#2; //class java/lang/StrinbBuilder
是说这里调用了lang包(这个包是默认导入的)中的StrinbBuilder

#3; //String abc
是说建立了一个String(字符串)类型的实例对象 它的值是 abc

其他的还没看明白
javaxiaobai 2008-12-15
  • 打赏
  • 举报
回复
都没人看呀.

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧