Mais conteúdo relacionado Semelhante a Java Bytecode Fundamentals - JUG.lv (20) Mais de Anton Arhipov (20) Java Bytecode Fundamentals - JUG.lv9. + 1 + 2 1 2 1 2 + 1 PUSH 1 10. + 1 + 2 1 2 1 2 + 2 PUSH 1 PUSH 2 1 11. + 1 + 2 1 2 1 2 + 3 PUSH 1 PUSH 2 ADD 12. + 1 + 2 1 2 1 2 + 3 ICONST_1 ICONST_2 IADD 18. javap Java class file disassembler Used with no options shows class structure only Methods, superclass, interfaces, etc -c – shows the bytecode -private – shows all classes and members -s – prints internal types signatures -l – prints lines numbers and local variable tables 19. C:orkuglasses>javap Hello -c Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 20. C:orkuglasses>javap Hello -verbose Compiled from "Hello.java“ public class Hello extends java.lang.Object SourceFile: "Hello.java" minor version: 0 major version: 50 Constant pool: const #1 = Method#6.#20; // java/lang/Object."<init>":()V const #2 = Field#21.#22; // java/lang/System.out:Ljava/io/PrintStream; const #3 = String#23; // Hello, World! const #4 = Method#24.#25; // java/io/PrintStream.println:(Ljava/lang/String;)V const #5 = class#26; // Hello const #6 = class#27; // java/lang/Object const #7 = Asciz<init>; const #8 = Asciz()V; 21. C:orkuglasses>javap Hello -verbose … public Hello(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LHello; 22. C:orkuglasses>javap Hello -verbose … public static void main(java.lang.String[]); Code: Stack=2, Locals=1, Args_size=1 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return LineNumberTable: line 4: 0 line 5: 8 LocalVariableTable: Start Length Slot Name Signature 0 9 0 args [Ljava/lang/String; 23. Stack Machine JVM is a stack-based machine Each thread has a stack Stack stores frames Frame is created on method invocation Frame: Operand stack Array of local variables 25. public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet; 26. 0 1 2 3 4 areturn aload_0 00 02 getfield public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet; 27. 0 1 2 3 4 B0 2A 00 02 B4 public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet; 28. public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet; 29. public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet; 30. public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet; 38. Local Variables public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I 39. Local Variables public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I numbered from 0 40. Local Variables instance methods have this at 0 public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I 41. Local Variables The table maps numbers to names public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I 42. Local Variables Sized explicitly public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I 43. Local Variables Stack Local Variables value var value depth ldc"Hello" astore_0 iconst_1 astore_1 aload_0 0 0 1 1 2 2 3 3 4 4 44. Local Variables Stack Local Variables value var value depth ldc"Hello" astore_0 iconst_1 astore_1 aload_0 0 0 "Hello" 1 1 2 2 3 3 4 4 45. Local Variables Stack Local Variables value var value depth ldc"Hello" astore_0 iconst_1 astore_1 aload_0 "Hello" 0 0 1 1 2 2 3 3 4 4 46. Local Variables Stack Local Variables value var value depth ldc"Hello" astore_0 iconst_1 astore_1 aload_0 "Hello" 0 0 1 1 1 2 2 3 3 4 4 47. Local Variables Stack Local Variables value var value depth ldc"Hello" astore_0 iconst_1 astore_1 aload_0 "Hello" 0 0 1 1 1 2 2 3 3 4 4 48. Local Variables Stack Local Variables value var value depth ldc"Hello" astore_0 iconst_1 astore_1 aload_0 "Hello" 0 0 "Hello" 1 1 1 2 2 3 3 4 4 51. Object Initialization: static {} static {}; Code: 0: iconst_1 1: putstatic #2; //Field a:I 4: iconst_2 5: putstatic #3; //Field b:I 8: return 52. Object Initialization: static {} <clinit> static {}; Code: 0: iconst_1 1: putstatic #2; //Field a:I 4: iconst_2 5: putstatic #3; //Field b:I 8: return 53. Object Initialization: new public Initializer(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: aload_0 5: new#2; //class java/lang/Object 8: dup 9: invokespecial #1; //Method java/lang/Object."<init>":()V 12: putfield #3; //Field o:Ljava/lang/Object; 15: return 54. Object Initialization: new public Initializer(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: aload_0 5: new#2; //class java/lang/Object 8: dup 9: invokespecial #1; //Method java/lang/Object."<init>":()V 12: putfield #3; //Field o:Ljava/lang/Object; 15: return 57. Object Initialization: {} public Initializer(int); Code: 0:aload_0 1:invokespecial #1; // ..<init> 4:aload_0 5:iconst_1 6:putfield #2; //Field a:I 9:aload_0 10:iconst_2 11:putfield #3; //Field c:I 14:aload_0 15:iload_1 16:putfield #4; //Field b:I 19:return 61. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn var value Stack 1 value depth 2 1 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 1 6 2 3 62. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn var value Stack 1 value depth 2 1 this 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 1 6 2 3 63. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; //createRandomValue() 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn var value Stack 1 value depth 2 1 objectref 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 1 6 2 3 64. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn var value Stack objectref 1 value depth 2 1 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 1 6 2 3 65. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn var value Stack objectref 1 value depth 2 1 this 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 1 6 2 3 66. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn var value Stack objectref 1 value depth 2 1 objectref 3 2 this 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 1 6 2 3 67. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3;//incValue 10: areturn var value Stack objectref 1 value depth 2 1 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 objectref 1 6 2 3 68. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn var value Stack objectref 1 value depth 2 1 objectref 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 objectref 1 6 2 3 69. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn var value Stack objectref 1 value depth 2 1 X 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8;// Integer.intValue:() 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 objectref 1 6 2 3 70. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn var value Stack objectref 1 value depth 2 1 1 3 2 X 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 objectref 1 6 2 3 71. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn var value Stack objectref 1 value depth 2 1 X + 1 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 objectref 1 6 2 3 72. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn var value Stack objectref 1 value depth 2 1 objectref 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7;//Integer.valueOf 9: areturn 5 objectref 1 6 2 3 73. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn var value Stack objectref 1 value depth 2 1 objectref 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 objectref 1 6 2 3 74. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn var value Stack objectref 1 value depth 2 1 objectref 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 1 6 2 3 75. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn var value Stack 1 value depth 2 1 objectref 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 1 6 2 3 76. Local Variables public java.lang.Object execute(); 0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn var value Stack 1 value depth 2 1 objectref 3 2 3 private java.lang.Integer incValue(java.lang.Integer); 4 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn 5 1 6 2 3 79. Stack value depth public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 80. Stack value depth public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn a 1 2 3 81. Stack value depth public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 10 1 a 2 3 82. Stack value depth public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 10 1 a 2 3 83. Stack value depth public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 84. Stack value depth public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 100 1 2 3 85. Stack value depth public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 100 1 2 3 86. Stack value depth public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3