@alex
把stripAtrribute設(shè)置成false后,即新的方法生成linenumber和localvariable屬性
這是原先的屬性信息
private String buildString$impl(int length)
Code(max_stack = 3, max_locals = 4, code_length = 51)
0: ldc "" (16)
2: astore_2
3: iconst_0
4: istore_3
5: goto #37
8: new <java.lang.StringBuilder> (18)
11: dup
12: aload_2
13: invokestatic java.lang.String.valueOf (Ljava/lang/Object;)Ljava/lang/String; (20)
16: invokespecial java.lang.StringBuilder.<init> (Ljava/lang/String;)V (26)
19: iload_3
20: bipush 26
22: irem
23: bipush 97
25: iadd
26: i2c
27: invokevirtual java.lang.StringBuilder.append (C)Ljava/lang/StringBuilder; (29)
30: invokevirtual java.lang.StringBuilder.toString ()Ljava/lang/String; (33)
33: astore_2
34: iinc %3 1
37: iload_3
38: iload_1
39: if_icmplt #8
42: getstatic java.lang.System.out Ljava/io/PrintStream; (37)
45: aload_2
46: invokevirtual java.io.PrintStream.println (Ljava/lang/String;)V (43)
49: aload_2
50: areturn
Attribute(s) =
LocalVariable(start_pc = 0, length = 51, index = 0:StringBuilder this)
LocalVariable(start_pc = 0, length = 51, index = 1:int length)
LocalVariable(start_pc = 3, length = 48, index = 2:String result)
LocalVariable(start_pc = 5, length = 40, index = 3:int i)
LineNumber(0, 6), LineNumber(3, 7), LineNumber(8, 8), LineNumber(34, 7),
LineNumber(42, 10), LineNumber(49, 12)
--------------------------------------------------------
完整的code.toString的信息
private String buildString(int length)
Code(max_stack = 6, max_locals = 5, code_length = 37)
0: invokestatic java.lang.System.currentTimeMillis ()J (81)
3: lstore_2
4: aload_0
5: iload_1
6: invokespecial StringBuilder.buildString$impl (I)Ljava/lang/String; (83)
9: astore %4
11: getstatic java.lang.System.out Ljava/io/PrintStream; (37)
14: dup
15: dup
16: ldc "Call to method buildString$impl took " (85)
18: invokevirtual java.io.PrintStream.print (Ljava/lang/String;)V (88)
21: invokestatic java.lang.System.currentTimeMillis ()J (81)
24: lload_2
25: lsub
26: invokevirtual java.io.PrintStream.print (J)V (91)
29: ldc " ms." (93)
31: invokevirtual java.io.PrintStream.println (Ljava/lang/String;)V (43)
34: aload %4
36: areturn
Attribute(s) =
LocalVariable(start_pc = 0, length = 51, index = 0:StringBuilder this)
LocalVariable(start_pc = 0, length = 51, index = 1:int length)
LocalVariable(start_pc = 3, length = 48, index = 2:String result)
LocalVariable(start_pc = 5, length = 40, index = 3:int i)
LineNumber(0, 6), LineNumber(3, 7), LineNumber(8, 8), LineNumber(34, 7),
LineNumber(42, 10), LineNumber(49, 12)
end method method method-----------------------------------
這個屬性信息使用還是使用的原先方法的,顯然length=55超過了指令的長度
36,執(zhí)行時會檢查類的局部變量屬性信息發(fā)現(xiàn)不正確就報錯了
這兩個屬性的信息應(yīng)該是用來調(diào)試器來使用的,可以自己在字節(jié)碼文件中自己添加這些信息,不過自己添加比較麻煩.
不過我另外一個程序的方法也自己生成了屬性信息,這些屬性信息也改變了,但是改變的不正確,但是程序能夠執(zhí)行。。
這中的原因我現(xiàn)在也搞不清楚了。
回復(fù) 更多評論