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都是啥意思
谢谢大家了
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都是啥意思
谢谢大家了
是说这里调用了lang包(这个包是默认导入的)中的StrinbBuilder #3; //String abc
是说建立了一个String(字符串)类型的实例对象 它的值是 abc其他的还没看明白
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的话该如何处理?这是优化的结果。
你使用 javap -verbose
选项就可以看到常量池的信息了。