我正在学习Java字节码。 我想知道我是否正确理解了这个字节码过程
我没有完成,但它只是以良好的方式开始......
00000000 aload_0
// load param1 (String)
// Stack is [StringParam]
00000001 invokevirtual char[] java.lang.String.toCharArray()
// split variable in an array of char
// Stack is [ReferenceToCharArray] ?
00000004 dup
// duplicate the top of operand stack and put it back at the end
// Stack is now [ReferenceToCharArray ReferenceToCharArray]
00000005 arraylength
// Return array's length
// Stack is now [ReferenceToCharArray ArrayLength]
00000006 iconst_2
// push 2 in stack
// Stack is now [ReferenceToCharArray ArrayLength 2]
00000007 if_icmpge pos.00000013
// If the Array length is greater or equals to 2
// Stack is now [ReferenceToCharArray]
00000013 areturn
// Return the array
// Stack is empty
答案 0 :(得分:1)
在调用virtual之后你的堆栈是错误的,param1不再是堆栈顶部。而且我认为3不会被放在堆栈上。
if_icmpge真正做的是将invokevirtual返回的char数组的长度与2进行比较