2011-12-17 12 views
0

私はJavaバイトコードについて学んでいます。私はこのバイトコードプロセスByteCode命令:わかりましたか?

私は終了しませんでしたが、それはちょうど良い方法で開始すること..です

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

にINVOKEVIRTUALによって返されたchar配列の長さを比較している何if_icmpgeが本当にやっている、なぜ近い票、それは有効な質問ですね? – bestsss

+0

小さな質問ですが、コードから関数の戻り値の型が分かりますか? – bestsss

+0

これは私が探している機能の一部です。戻り値の型はchar型の配列だと思います。 –

答えて

1

あなたのスタックが仮想起動後に間違っていますparam1はもはやスタックの先頭ではありません。そして私は3つがスタックに置かれるとは思わない。

ところで2

+0

これは正しい答えです、私はそれが配列の長さを2と比較しようとしていましたが、すでに完了しています:) – bestsss

+0

私の最初の答えを更新しました。誰かが新しいスタックを検証できますか? –

+0

更新されたスタックが正しく見えます。 –