JVM рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯрдХреЛрдб рд╕реЗ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб

рд╣рдо рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ


рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╣реЛрдЧрд╛ рдЬреЛ рд╕рддрд╣реА рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЬреЗрд╡реАрдПрдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдо рд╕реЗ рдХрдо рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢ (рдЙрдирдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди)ред


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ JDK рд╕реЗ javap рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ javap рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


рдФрд░ рд╣рдо рдЬреЗрд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдмрд╛рдпреЛрдЯреЗрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ


рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдкреБрд╕реНрддрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ JVM рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдереА - рдж рдЬрд╛рд╡рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕реНрдкреЗрд╕рд┐рдлрд╝рд┐рдХреЗрд╢рди рдПрдЯ рдСрд░реЗрдХрд▓


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдПрдВ:


  public class Main { public static void main(String ... args) { System.out.println("Hello World"); } } 

рдпрд╣ javac Main.java рдЯреАрдо рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ disassembling рдХрд░реЗрдВ


  javap -c -v Main 

Main.class


 Classfile /C:/Users/Arthur/playground/java/jvm/Main.class Last modified 26.10.2019; size 413 bytes MD5 checksum 6449121a3bb611fee394e4f322401ee1 Compiled from "Main.java" public class Main minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #6.#15 // java/lang/Object."<init>":()V #2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream; #3 = String #18 // Hello World #4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V #5 = Class #21 // Main #6 = Class #22 // java/lang/Object #7 = Utf8 <init> #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 main #12 = Utf8 ([Ljava/lang/String;)V #13 = Utf8 SourceFile #14 = Utf8 Main.java #15 = NameAndType #7:#8 // "<init>":()V #16 = Class #23 // java/lang/System #17 = NameAndType #24:#25 // out:Ljava/io/PrintStream; #18 = Utf8 Hello World #19 = Class #26 // java/io/PrintStream #20 = NameAndType #27:#28 // println:(Ljava/lang/String;)V #21 = Utf8 Main #22 = Utf8 java/lang/Object #23 = Utf8 java/lang/System #24 = Utf8 out #25 = Utf8 Ljava/io/PrintStream; #26 = Utf8 java/io/PrintStream #27 = Utf8 println #28 = Utf8 (Ljava/lang/String;)V { public Main(); descriptor: ()V flags: ACC_PUBLIC 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 public static void main(java.lang.String...); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC, ACC_VARARGS 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 } SourceFile: "Main.java" 

рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╛рдИрдЯреЗрдХреЛрдб рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ рдЬреЛ рдореВрд▓ рдмрд╛рдпреЛрдЯреЗрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИ:


  cafe babe 0000 0034 001d 0a00 0600 0f09 0010 0011 0800 120a 0013 0014 0700 1507 0016 0100 063c 696e 6974 3e01 0003 2829 5601 0004 436f 6465 0100 0f4c 696e 654e 756d 6265 7254 6162 6c65 0100 046d 6169 6e01 0016 285b 4c6a 6176 612f 6c61 6e67 2f53 7472 696e 673b 2956 0100 0a53 6f75 7263 6546 696c 6501 0009 4d61 696e 2e6a 6176 610c 0007 0008 0700 170c 0018 0019 0100 0b48 656c 6c6f 2057 6f72 6c64 0700 1a0c 001b 001c 0100 044d 6169 6e01 0010 6a61 7661 2f6c 616e 672f 4f62 6a65 6374 0100 106a 6176 612f 6c61 6e67 2f53 7973 7465 6d01 0003 6f75 7401 0015 4c6a 6176 612f 696f 2f50 7269 6e74 5374 7265 616d 3b01 0013 6a61 7661 2f69 6f2f 5072 696e 7453 7472 6561 6d01 0007 7072 696e 746c 6e01 0015 284c 6a61 7661 2f6c 616e 672f 5374 7269 6e67 3b29 5600 2100 0500 0600 0000 0000 0200 0100 0700 0800 0100 0900 0000 1d00 0100 0100 0000 052a b700 01b1 0000 0001 000a 0000 0006 0001 0000 0001 0089 000b 000c 0001 0009 0000 0025 0002 0001 0000 0009 b200 0212 03b6 0004 b100 0000 0100 0a00 0000 0a00 0200 0000 0400 0800 0500 0100 0d00 0000 0200 0e 

(рдЖрдк рдЕрдкрдиреА .class рдлрд╛рдЗрд▓ рдХреЛ Sublime Text рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдЗрд▓-> рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕реЗрд╡ рдХрд░реЗрдВ -> Hexademical)


рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред


рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рднреНрд░рдорд┐рдд рди рд╣реЛрдВ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рд╣реИ, рдФрд░ рдмрд╛рдпрдЯреЗрдХреЛрдб, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдареЛрд░ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


  ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; } 

рдЖрдк рдЗрд╕реЗ рдЬреЗрд╡реАрдПрдо рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЕрдзреНрдпрд╛рдп 4.1 рдж рдХреНрд▓рд╛рд╕рдлрд╛рдЗрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЖрдпрд╛рдо рдмрд╛рдИрдВ рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджрд╛рдИрдВ рдУрд░ рд╡рд┐рд╡рд░рдгред


рд╣рдо рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдореЗрдВ рдмрд╛рдЗрдЯрдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдХ рдореЗрдВ 4 рдмрд┐рдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП - 4 рдЕрдВрдХ рдФрд░ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП - 8 рдЕрдВрдХред


рдЬрд╛рджреВ


рдЬрд╛рджреВ рдПрдХ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ 0xCAFEBABE рдмрд░рд╛рдмрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЕрдкрдирд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╣реИ ред


minor_version, major_version


рдпреЗ рдЖрдкрдХреА class рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред рдЕрдЧрд░ рд╣рдо major_version рдПрдо рдФрд░ minor_version рдПрдо рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрдкрдиреА class рдлрд╛рдЗрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг Mm


рдЕрдм рдореИрдВ рддреБрд░рдВрдд рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рд╕реЗ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:


  cafe babe -- magic 0000 -- minor_version 0034 -- major_version 

рд╣рдо рдЗрд╕реЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рдХреЛрдб рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд╢рдорд▓рд╡ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ:


  ... public class Main minor version: 0 major version: 52 flags: ACC_PUBLIC, ... 

constant_pool_count


рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдореЗрдВ рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдпрд╣рд╛рдВ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИред рдЙрд╕реА рд╕рдордп, рдпрджрд┐ рдЖрдк рд╢реБрджреНрдз рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЧрд▓рдд рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреВрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд░рдХ (рдЪреЗрдХ!) рдкрд░ рдЬрд╛рдПрдЧрд╛ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдордд рднреВрд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЛ ___ + 1 рдореЗрдВ рд╡рд╣рд╛рдБ_рдХрд░рд┐рдпреЛрдВ рдХреА ___ + 1 рд▓рд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП


рдХреБрд▓ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:


  cafe babe -- magic 0000 0034 -- version 001d -- constant_pool_count 

рдирд┐рд░рдВрддрд░_рдкреБрд▓ []


рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреА рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ:


  cp_info { u1 tag; u1 info[]; } 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реЗ рд╣рдордиреЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП tag рдкрдврд╝рд╛ рдФрд░ рдЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдореВрд▓реНрдп рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреНрдпрд╛ рд╣реИ info[]


рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рддрд╛рд▓рд┐рдХрд╛ 4.3 рд▓рдЧрд╛рддрд╛рд░ рдкреВрд▓ рдЯреИрдЧ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рджрд░рдЕрд╕рд▓, рдпрд╣рд╛рдВ рдЯреИрдмрд▓реЗрдЯ рд╣реИ:


рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рдХрд╛рд░рдореВрд▓реНрдп
CONSTANT_Class7
CONSTANT_Fieldref9
CONSTANT_Methodref10
CONSTANT_InterfaceMethodref11
CONSTANT_String8
CONSTANT_Integer3
CONSTANT_Float4
CONSTANT_Long5
CONSTANT_Double6
CONSTANT_NameAndType12
CONSTANT_Utf81
CONSTANT_MethodHandle15
CONSTANT_MethodType16
CONSTANT_InvokeDynamic18

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИред


рдпрд╣рд╛рдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CONSTANT_Class рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


  CONSTANT_Class_info { u1 tag; u2 name_index; } 

рдХреНрд╖реЗрддреНрд░ рдФрд░ рд╡рд┐рдзрд┐ рд╕рдВрд░рдЪрдирд╛:


  CONSTANT_Fieldref_info { u1 tag; u2 class_index; u2 name_and_type_index; } CONSTANT_Methodref_info { u1 tag; u2 class_index; u2 name_and_type_index; } 

рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдВрдмрд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИред


рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рднрд╛рдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


  cafe babe 0000 0034 001d -- constant_pool_count 0a00 0600 0f09 0010 0011 0800 12 ... 

рддреЛ, рд╣рдо рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рд▓реА рдмрд╛рдЗрдЯ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИред рдпрд╣рд╛рдБ рд╣рдо 0a (10) рджреЗрдЦрддреЗ рд╣реИрдВ - рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрд╣ CONSTANT_Methodref


рд╣рдо рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:


  CONSTANT_Methodref_info { u1 tag; u2 class_index; u2 name_and_type_index; } 

рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдЗрдЯ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ class_index рдФрд░ name_and_type_index рд▓рд┐рдП 4 рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


  cafe babe 0000 0034 001d -- constant_pool_count 0a 0006 000f -- CONSTANT_Methodref 0900 1000 1108 0012 ... 

рдЦреИрд░, рд╣рдореЗрдВ рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд┐рд▓рд╛ред рдЖрдЧреЗ рдмрдврд╝реЛред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, 09 - рдХрд╛ рдЕрд░реНрде рд╣реИ CONSTANT_Fieldref рдкреНрд░рдХрд╛рд░


рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:


  cafe babe 0000 0034 001d -- constant_pool_count 0a 0006 000f -- CONSTANT_Methodref 09 0010 0011 -- CONSTANT_Fieldref 08 0012 ... 

рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рдПрдХ рдЬреИрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ CONSTANT_String рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:


  CONSTANT_String_info { u1 tag; u2 string_index; } 

рдЗрди рд╕рднреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЕрдзреНрдпрд╛рдп 4.4 рдж рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдкреВрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ info рдЕрдВрджрд░ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрд░реНрде рд╣реИред


*_index рдкреИрдЯрд░реНрди рдХреЗ рддрд╣рдд *_index рддрд░реАрдХреЛрдВ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдЯреЗрдмрд▓ рд╕реЗ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CONSTANT_Class_info string_index рд▓рд┐рдП string_index рдФрд░ CONSTANT_Utf8_info string_index рд▓рд┐рдП string_index


рд╣рдо рдЗрд╕реЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рдХреЛрдб рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


  #1 = Methodref #6.#15 // java/lang/Object."<init>":()V #2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream; #3 = String #18 

  0a 0006 000f -- CONSTANT_Methodref 09 0010 0011 -- CONSTANT_Fieldref 08 0012 -- CONSTANT_String 

рдЖрдк рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ рддрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рднреА рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдк рдЕрдзреНрдпрд╛рдп 4.4.4 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдХреЗрд╡рд▓ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдирдорд╕реНрддреЗ рд╡рд┐рд╢реНрд╡ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЕрднреА рддрдХ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд░реЗрдЦрд╛ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:


  CONSTANT_Utf8_info { u1 tag; u2 length; u1 bytes[length]; } 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб:


  01 -- tag 000b -- length 48 65 6c 6c 6f 20 57 6f 72 6c 64 -- bytes[length] // H ello W orld 

рдмрд╛рдИрдЯрдХреЛрдб рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдкреВрд░реЗ рдкреВрд▓ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ:


рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдкреВрд░рд╛ рдкреВрд▓
  -- [Constant Pool] -- methodref 0a 0006 000f -- fieldref 09 0010 0011 -- string 08 0012 -- methodref 0a 0013 0014 -- Class 07 0015 -- Class 07 0016 -- Utf8 01 0006 3c 69 6e 69 74 3e -- Utf8 01 0003 28 29 56 -- Utf8 01 0004 43 6f 64 65 -- Utf8 01 000f 4c 69 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65 -- Utf8 01 0004 6d 61 69 6e -- Utf8 01 0016 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 -- Utf8 01 000a 53 6f 75 72 63 65 46 69 6c 65 -- Utf8 01 0009 4d 61 69 6e 2e 6a 61 76 61 -- NameAndType 0c 0007 0008 -- Class 07 0017 -- NameAndType 0c 0018 0019 -- Utf8 01 000b 48 65 6c 6c 6f 20 57 6f 72 6c 64 -- Class 07 001a -- NameAndType 0c 001b 001c -- Utf8 01 0004 4d 61 69 6e -- Utf8 01 0010 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 -- Utf8 01 0010 6a 61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d -- Utf8 01 0003 6f 75 74 -- Utf8 01 0015 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 3b -- Utf8 01 0013 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d -- Utf8 01 0007 70 72 69 6e 74 6c 6e -- Utf8 01 0015 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 -- [Constant Pool END] 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдЕрд╕рдВрддреБрд╖реНрдЯ рдХреЛрдб рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


  Constant pool: #1 = Methodref #6.#15 // java/lang/Object."<init>":()V #2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream; #3 = String #18 // Hello World #4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V #5 = Class #21 // Main #6 = Class #22 // java/lang/Object #7 = Utf8 <init> #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 main #12 = Utf8 ([Ljava/lang/String;)V #13 = Utf8 SourceFile #14 = Utf8 Main.java #15 = NameAndType #7:#8 // "<init>":()V #16 = Class #23 // java/lang/System #17 = NameAndType #24:#25 // out:Ljava/io/PrintStream; #18 = Utf8 Hello World #19 = Class #26 // java/io/PrintStream #20 = NameAndType #27:#28 // println:(Ljava/lang/String;)V #21 = Utf8 Main #22 = Utf8 java/lang/Object #23 = Utf8 java/lang/System #24 = Utf8 out #25 = Utf8 Ljava/io/PrintStream; #26 = Utf8 java/io/PrintStream #27 = Utf8 println #28 = Utf8 (Ljava/lang/String;)V 

рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ javap рдЗрд╕ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдореЗрдВ рдПрдХ рд╕реНрд╡рд░реВрдкрд┐рдд рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред


рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


  public Main(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 //    1    4: return 

рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдЕрдзреНрдпрд╛рдп 4.4 The Constant Pool рджреЗрдЦреЗрдВред


ClassFile рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЖрдЧреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ


access_flags


рдпрд╣ рд╕рдВрд╢реЛрдзрдХ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рдЯрдорд╛рд╕реНрдХ рд╣реИред


рдЭрдВрдбреЗ рдХрд╛ рдирд╛рдордореВрд▓реНрдпрд╡реНрдпрд╛рдЦреНрдпрд╛
ACC_PUBLIC0x0001рдШреЛрд╖рд┐рдд public ; рдЗрд╕рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
ACC_FINAL0x0010рдШреЛрд╖рд┐рдд final ; рдХрд┐рд╕реА рдЙрдкрд╡рд░реНрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред
ACC_SUPER0x0020рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдЪрд╛рд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрдм рдХрд░реЗрдВ рдЬрдм рдЗрдирд╡реЛрдХреЗрд╢рдирд▓ рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЗрдирд╡реЙрдЗрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред
ACC_INTERFACE0x0200рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдХреНрд▓рд╛рд╕ рдирд╣реАрдВред
ACC_ABSTRACT0x0400рдШреЛрд╖рд┐рдд abstract ; рддрддреНрдХрд╛рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
ACC_SYNTHETIC0x1000рдШреЛрд╖рд┐рдд рд╕рд┐рдВрдереЗрдЯрд┐рдХ; рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
ACC_ANNOTATION0x2000рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред
ACC_ENUM0x4000рдПрдХ enum рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред

this_class


this рд╡рд░реНрдЧ рдкрд░ рдПрдХ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкрддрд╛ 5 рдкрд░ рд╕реНрдерд┐рдд рд╣реИ:


  Constant pool: #1 = Methodref #6.#15 // java/lang/Object."<init>":()V #2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream; #3 = String #18 // Hello World #4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V #5 = Class #21 // Main #6 = Class #22 // java/lang/Object ... 

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдЪрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ CONSTANT_Class_info рдЕрдиреБрд░реВрдк рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП


super_class


рдХрдХреНрд╖рд╛ рдкреВрд░реНрд╡рдЬреЛрдВ рдХрд╛ рдкрддрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рди #6 рдкрддреЗ рдкрд░ рд╣реИред рдЦреИрд░, CONSTANT_Class_info рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ


рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд╛рдо CONSTANT_Utf8_info рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрджрд┐ рд╣рдо #21 рдФрд░ #22 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ:


  ... #21 = Utf8 Main #22 = Utf8 java/lang/Object ... 

рдЕрд░реНрдерд╛рддреН, рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ name_index рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


  CONSTANT_Class_info { u1 tag; u2 name_index; } 

interfaces_count, рдлрд╝реАрд▓реНрдб_count


рд╡реЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХрд╛ рдорд╛рди 0000 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛, рдФрд░ fields[] , interfaces[] рдмрд╛рдж рдХреЗ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред


рдФрд░ рдкрдврд╝реЗрдВ 4.1 ClassFile рд╕рдВрд░рдЪрдирд╛


methods_count


рддрд░реАрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдпрджреНрдпрдкрд┐ рдХреЛрдб рдореЗрдВ рд╣рдо рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рд╣реИрдВред main рд╡рд┐рдзрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рднреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рджреЛ рд╣реИред


рд╡рд┐рдзрд┐рдпрд╛рдБ []


рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдЕрдзреНрдпрд╛рдп 4.6 рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд method_info рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП


  method_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count]; } 

рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ (рд╕реНрд╡рд░реВрдкрд┐рдд, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде) рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


  -- [methods] -- public Main(); 0001 --access_flags 0007 -- name_index 0008 -- descriptor_index 0001 -- attributes_count -- attribute_info 0009 -- attribute_name_index (Code) 0000 001d - attribute_length 0001 -- max_stack 0001 -- max_locals 0000 0005 -- code_length 2a b7 00 01 b1 -- code[] 0000 -- exception_table_length 0001 -- attributes_count; 000a -- attribute_name_index 0000 0006 -- attribute_length 00 01 00 00 00 01 -- public static void main(java.lang.String...); 0089 --access_flags 000b -- name_index 000c -- descriptor_index 0001 -- attributes_count -- attribute_info 0009 -- attribute_name_index (Code) 0000 0025 -- attribute_length 0002 -- max_stack 0001 -- max_locals 0000 0009 -- code_length b2 00 02 12 03 b6 00 04 b1 -- code[] 0000 -- exception_table_length 0001 -- attributes_count 000a -- attribute_name_index 0000 000a -- attribute_length 00 02 00 00 00 04 00 08 00 05 -- [methods END] 

рдЖрдЗрдП рддрд░реАрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:


access_flags


рд╕рдВрд╢реЛрдзрдХ рдореБрдЦреМрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛ 4.5 рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЭрдВрдбреЗ


рдЭрдВрдбреЗ рдХрд╛ рдирд╛рдордореВрд▓реНрдпрд╡реНрдпрд╛рдЦреНрдпрд╛
ACC_PUBLIC0x0001рдШреЛрд╖рд┐рдд public ; рдЗрд╕рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
ACC_PRIVATE0x0002рдШреЛрд╖рд┐рдд private ; рдХреЗрд╡рд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрдХреНрд╖рд╛ рдХреЗ рднреАрддрд░ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдпред
ACC_PROTECTED0x0004protected рдШреЛрд╖рд┐рдд; рдЙрдкрд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
ACC_STATIC0x0008рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ static ред
ACC_FINAL0x0010рдШреЛрд╖рд┐рдд final ; рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ( .45.4.5 )ред
ACC_SYNCHRONIZED0x0020рдШреЛрд╖рд┐рдд synchronized ; рдордВрдЧрд▓рд╛рдЪрд░рдг рдПрдХ рдореЙрдирд┐рдЯрд░ рдЙрдкрдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИред
ACC_BRIDGE0x0040рдПрдХ рдкреБрд▓ рд╡рд┐рдзрд┐, рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрдиред
ACC_VARARGS0x0080рддрд░реНрдХреЛрдВ рдХреА рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдШреЛрд╖рдгрд╛ рдХреАред
ACC_NATIVE0x0100рдШреЛрд╖рд┐рдд native ; рдЬрд╛рд╡рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
ACC_ABSTRACT0x0400рдШреЛрд╖рд┐рдд abstract ; рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
ACC_STRICT0x0800рдШреЛрд╖рд┐рдд strictfp ; рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдореЛрдб рдПрдлрдкреА-рд╕рдЦреНрдд рд╣реИред
ACC_SYNTHETIC0x1000рдШреЛрд╖рд┐рдд рд╕рд┐рдВрдереЗрдЯрд┐рдХ; рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдмрд╛рдпрдЯреЗрдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, public Main(); рд╡рд┐рдзрд┐ рдореЗрдВ public Main(); (рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░) рдорд╛рд╕реНрдХ 0001 , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ ACC_PUBLIC ред


рдЕрдм рдЪрд▓реЛ main рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрд╡рдпрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╡рд╣ рд╣реИ:


  • рдЬрдирддрд╛ - ACC_PUBLIC - 0x0001
  • рд╕реНрдереИрддрд┐рдХ - ACC_STATIC - 0x0008
  • рд╕реНрдЯреНрд░рд┐рдВрдЧ ... args - ACC_VARARGS - 0x0080

рд╣рдо рдореБрдЦреМрдЯрд╛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ: 0x0001 + 0x0008 + 0x0080 = 0x0089 ред рддреЛ рд╣рдореЗрдВ access_flag рдорд┐рд▓рд╛


рд╡реИрд╕реЗ, ACC_VARARGS рдпрд╣рд╛рдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдо
рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ [] рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп args ... args, рддреЛ рдпрд╣ рдзреНрд╡рдЬ рдирд╣реАрдВ рд╣реЛрдЧрд╛

name_index


рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдкрддрд╛ ( CONSTANT_Utf8_info )ред рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдирд╛рдо рдореБрдЦреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди <init> , рд╕реЗрд▓ # 7 рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред


рдЕрдзреНрдпрд╛рдп 2.9 рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ <init> рдФрд░ <clinit> рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ


descriptor_index


рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рд╕рдВрднрд╛рд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкрддрд╛ рд╣реИред рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, JVM рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдП рдЧрдП рд╕рдВрдХреНрд╖рд┐рдкреНрддрд╛рдХреНрд╖рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:


рдмреЗрд╕ рдЯрд╛рдЗрдк рдЪрд░рд┐рддреНрд░рдЯрд╛рдЗрдкрд╡реНрдпрд╛рдЦреНрдпрд╛
Bbyteрдмрд╛рдЗрдЯ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП
CcharрдпреВрдиреАрдлрд╝ -16 рдХреЗ рд╕рд╛рде рдПрдирдХреЛрдбреЗрдб рдмреЗрд╕рд┐рдХ рдмрд╣реБрднрд╛рд╖реА рдкреНрд▓реЗрди рдореЗрдВ рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдг рдХреЛрдб рдкреЙрдЗрдВрдЯ
Ddoubleрдбрдмрд▓-рд╕рдЯреАрдХ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдорд╛рди
FfloatрдПрдХрд▓-рд╕рдЯреАрдХ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдорд╛рди
IintрдкреВрд░реНрдгрд╛рдВрдХ
Jlongрд▓рдВрдмреЗ рдкреВрд░реНрдгрд╛рдВрдХ
L рдХреНрд▓рд╛рд╕рдиреЗрдо ;referenceрдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕рдирд╛рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
SshortрдЕрд▓реНрдк рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП
Zbooleantrue рдпрд╛ false
[referenceрдПрдХ рд╕рд░рдгреА рдЖрдпрд╛рдо

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


  ( ParameterDescriptor* ) ReturnDescriptor 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╡рд┐рдзрд┐:


  Object method(int i, double d, Thread t) {..} 

рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


  (IDLjava/lang/Thread;)Ljava/lang/Object 

рдЕрд╕рд▓ рдореЗрдВ, I int , D double , рдФрд░ Ljava/lang/Thread; рдорд╛рдирдХ java.lang рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХреНрд▓рд╛рд╕ Thread ред


рдЕрдЧрд▓рд╛, рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХреА рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рднреА рд╣реИред


рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЗрд╕рдХрд╛ attributes_count рдЧрдгрдирд╛ рд╣реИ


рдлрд┐рд░ рдЕрдзреНрдпрд╛рдп 4.7 рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ


  attribute_info { u2 attribute_name_index; u4 attribute_length; u1 info[attribute_length]; } 

attribute_name_index


рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ Code ред рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдПрдХ рдЕрд▓рдЧ рдмрдбрд╝рд╛ рд╡рд┐рд╖рдп рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ CONSTANT_Utf8_info рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдореЗрдВ рдкрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CONSTANT_Utf8_info рдХреЗрд╡рд▓ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ


attribute_length


рдЗрд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рд▓рдВрдмрд╛рдИ рд╕рдорд╛рд╣рд┐рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ attribute_name_index рдФрд░ attribute_length рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ


рдЬрд╛рдирдХрд╛рд░реА


рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо Code рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛_name_index рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╣рдордиреЗ Code рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдкреВрд▓ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рд╣реИред


рдФрд░ рдкрдврд╝реЗрдВ: рдЕрдзреНрдпрд╛рдп 4.7.3 рдХреЛрдб рд╡рд┐рд╢реЗрд╖рддрд╛


рдпрд╣рд╛рдБ рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


  Code_attribute { u2 attribute_name_index; u4 attribute_length; u2 max_stack; u2 max_locals; u4 code_length; u1 code[code_length]; u2 exception_table_length; { u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type; } exception_table[exception_table_length]; u2 attributes_count; attribute_info attributes[attributes_count]; } 

max_stack


рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рдЙрдкрд╕рд░реНрдЧ рдЕрдзрд┐рдХрддрдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдСрдкрд░реЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░ рд╣реИред рдЦреИрд░, рдпрд╣ рдирд╛рдо рддрд░реНрдХ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрддрдо рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░ред


рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, JVM рдСрдкрд░реЗрдВрдб рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдЧрд╛ред рд╡рд╣рд╛рдВ рдЖрдк рдПрдХ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдХрдо рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред


рд╕реНрдЯреИрдХ рдХреЗ рд╡рд┐рд╖рдп рдкрд░, рдЖрдк " рдЬрд╛рд╡рд╛ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реНрдЯреИрдХ рдФрд░ рдвреЗрд░ рдкрд░ " рдпрд╛ " рдЬреЗрд╡реАрд╡реА рдЗрдВрдЯрд░рдиреЗрд╢рдирд▓ " рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ


max_locals


рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░


рдЖрдк JVM рдХреЗ рдХреЛрд░ рдкрд░ рдпрд╛ рдЙрд╕реА JVM рдЗрдВрдЯрд░реНрдирд▓ рдореЗрдВ Mastering Java Bytecode рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ


code_length


рдХреЛрдб рдХрд╛ рдЖрдХрд╛рд░ рдЬреЛ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛


рдХреЛрдб []


рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред optcode рдХреЗ рд╕рд╣рд╕рдВрдмрдВрдзреЛрдВ рдХреА optcode рдФрд░ optcode рд╕рд╛рде рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ - рдЬрд╛рд╡рд╛ рдмрд╛рдЗрдЯрдХреЛрдб рдирд┐рд░реНрджреЗрд╢ рд╕реВрдЪрд┐рдпреЛрдВ рдпрд╛ рдкреБрд╕реНрддрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд▓реЗрдВ:


  -- public Main(); 0001 --access_flags 0007 -- name_index 0008 -- descriptor_index 0001 -- attributes_count -- attribute_info 0009 -- attribute_name_index (Code) 0000 001d - attribute_length 00 01 -- max_stack 00 01 -- max_locals 00 00 00 05 -- code_length 2a b7 00 01 b1 -- code[] 0000 -- exception_table_length 0001 -- attributes_count; 00 0a -- attribute_name_index 0000 0006 -- attribute_length 00 01 00 00 00 01 

рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдирд╛ рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:


  2a b7 00 01 b1 

рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрджреЗрд╢реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ:


  2a - aload_0 b7 0001 - invokespecial #1 b1 - return 

рдЗрди рдЖрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдпрд╣рд╛рдВ рднреА рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЕрдзреНрдпрд╛рдп 4.10.1.9ред рдЬрд╛рдБрдЪ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдЯрд╛рдЗрдк рдХрд░реЗрдВ


exception_table_length


рдЕрдкрд╡рд╛рдж_table рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрд╡рд╛рдж рд╣реБрдХ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдзреНрдпрд╛рдп 4.7.3 рдХреЛрдб рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ


рдЕрдкрд╡рд╛рдж_рд░реВрдк []


рдЗрд╕рдХреА рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


  { u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type; } 

рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕ рдХреЛрдб рдХреА рд╢реБрд░реБрдЖрдд, рдЕрдВрдд ( start_pc , end_pc ) handler_pc рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ handler_pc рд╣реИрдВрдбрд▓ рдХрд░реЗрдЧрд╛ рдФрд░ catch_type рдЕрдкрд╡рд╛рдж catch_type


attributes_count


Code рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛


рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ []


рдЧреБрдг рдЕрдХреНрд╕рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдпрд╛ рдбреАрдмрдЧрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред




рдмрд╛рдЗрдЯрдХреЛрдб рдЙрдкрдХрд░рдг


рдпрд╣ рд╡рд╣ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред


рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдХрд░рдг рд╣реИрдВред рдпрд╣рд╛рдБ рдореИрдВ Apache Commons рд╕реЗ рдмрд╛рдЗрдЯ рдХреЛрдб рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (BCEL) рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдХреБрдЫ рдмрд╛рдЗрдЯрдХреЛрдб рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


  // read file from resources/complied/ClassA.class InputStream inputStream = ClassParserExample.class.getResourceAsStream("/compiled/ClassA.class"); if (inputStream == null) throw new FileNotFoundException(); ClassParser parser = new ClassParser(inputStream, "ClassA.class"); JavaClass clazz = parser.parse(); final String HEX_BYTECODE = getHex(clazz.getBytes()); System.out.println("Hex bytecode: "); System.out.println(HEX_BYTECODE); System.out.println(); final String MINOR_VER = getHex(clazz.getMinor()); final String MAJOR_VER = getHex(clazz.getMajor()); final String CONSTANT_POOL = getHex(clazz.getConstantPool().getConstantPool()); final String ACCESS_FLAGS = getHex(clazz.getAccessFlags()); final String THIS_CLASS = getHex(clazz.getClassName().getBytes()); final String SUPER_CLASS = getHex(clazz.getSuperClass().getBytes()); final String INTERFACES = getHex(clazz.getInterfaces()); final String FIELDS = getHex(clazz.getFields()); final String METHODS = getHex(clazz.getMethods()); final String ATTRIBUTES = getHex(clazz.getAttributes()); 

рдкреВрд░реНрдг рдХреЛрдб рд╕реВрдЪреА
 import org.apache.bcel.classfile.*; import org.apache.commons.codec.binary.Hex; import java.io.*; public class ClassParserExample { public static void main(String... args) throws IOException, ClassNotFoundException { // read file from resources/complied/ClassA.class InputStream inputStream = ClassParserExample.class.getResourceAsStream("/compiled/ClassA.class"); if (inputStream == null) throw new FileNotFoundException(); ClassParser parser = new ClassParser(inputStream, "ClassA.class"); JavaClass clazz = parser.parse(); final String HEX_BYTECODE = getHex(clazz.getBytes()); System.out.println("Hex bytecode: "); System.out.println(HEX_BYTECODE); System.out.println(); final String MINOR_VER = getHex(clazz.getMinor()); final String MAJOR_VER = getHex(clazz.getMajor()); final String CONSTANT_POOL = getHex(clazz.getConstantPool().getConstantPool()); final String ACCESS_FLAGS = getHex(clazz.getAccessFlags()); final String THIS_CLASS = getHex(clazz.getClassName().getBytes()); final String SUPER_CLASS = getHex(clazz.getSuperClass().getBytes()); final String INTERFACES = getHex(clazz.getInterfaces()); final String FIELDS = getHex(clazz.getFields()); final String METHODS = getHex(clazz.getMethods()); final String ATTRIBUTES = getHex(clazz.getAttributes()); System.out.println( "minor: " + MINOR_VER ); // 0 System.out.println( "major: " + MAJOR_VER ); // 34 System.out.println( "constant pool: " + CONSTANT_POOL); // not correctly System.out.println( "access flags: " + ACCESS_FLAGS ); // 21 System.out.println( "this class: " + THIS_CLASS ); System.out.println( "super class: " + SUPER_CLASS ); // Object System.out.println( "interfaces: " + INTERFACES ); // <empty> System.out.println( "fields: " + FIELDS ); // <empty> System.out.println( "methods: " + METHODS ); // one method: psvm hello world System.out.println( "attributes: " + ATTRIBUTES ); // 536f7572636546696c65 - I think it's instructions for Java tools } private static String getHex(byte[] bytes){ return Hex.encodeHexString(bytes); } private static String getHex(int intNum){ return Integer.toHexString(intNum); } private static String getHex(Constant[] constants){ if (constants == null) return null; StringBuilder sb = new StringBuilder(); for (Constant c : constants){ if (c == null) continue; sb.append(getHex(c.getTag())).append(" "); } return sb.toString(); } private static String getHex(JavaClass[] clazzes){ if (clazzes == null) return null; StringBuilder sb = new StringBuilder(); for (JavaClass c : clazzes){ sb.append(getHex(c.getClassName().getBytes())).append(" "); } return sb.toString(); } private static String getHex(Field[] fields){ if (fields == null) return null; StringBuilder sb = new StringBuilder(); for (Field c : fields){ sb.append(getHex(c.getName().getBytes())).append(" "); } return sb.toString(); } private static String getHex(Method[] methods){ if (methods == null) return null; StringBuilder sb = new StringBuilder(); for (Method c : methods){ sb.append(getHex(c.getName().getBytes())).append(" "); } return sb.toString(); } private static String getHex(Attribute[] attributes){ if (attributes == null) return null; StringBuilder sb = new StringBuilder(); for (Attribute c : attributes){ sb.append(getHex(c.getName().getBytes())).append(" "); } return sb.toString(); } } /* Class A: public class ClassA { public static void main(String[] args) { System.out.println("Hello world"); } } */ /* Class A bytecode: cafe babe 0000 0034 0022 0a00 0600 1409 0015 0016 0800 170a 0018 0019 0700 1a07 001b 0100 063c 696e 6974 3e01 0003 2829 5601 0004 436f 6465 0100 0f4c 696e 654e 756d 6265 7254 6162 6c65 0100 124c 6f63 616c 5661 7269 6162 6c65 5461 626c 6501 0004 7468 6973 0100 1d4c 636f 6d2f 6170 706c 6f69 6478 7878 2f70 6172 7365 2f43 6c61 7373 413b 0100 046d 6169 6e01 0016 285b 4c6a 6176 612f 6c61 6e67 2f53 7472 696e 673b 2956 0100 0461 7267 7301 0013 5b4c 6a61 7661 2f6c 616e 672f 5374 7269 6e67 3b01 000a 536f 7572 6365 4669 6c65 0100 0b43 6c61 7373 412e 6a61 7661 0c00 0700 0807 001c 0c00 1d00 1e01 000b 4865 6c6c 6f20 776f 726c 6407 001f 0c00 2000 2101 001b 636f 6d2f 6170 706c 6f69 6478 7878 2f70 6172 7365 2f43 6c61 7373 4101 0010 6a61 7661 2f6c 616e 672f 4f62 6a65 6374 0100 106a 6176 612f 6c61 6e67 2f53 7973 7465 6d01 0003 6f75 7401 0015 4c6a 6176 612f 696f 2f50 7269 6e74 5374 7265 616d 3b01 0013 6a61 7661 2f69 6f2f 5072 696e 7453 7472 6561 6d01 0007 7072 696e 746c 6e01 0015 284c 6a61 7661 2f6c 616e 672f 5374 7269 6e67 3b29 5600 2100 0500 0600 0000 0000 0200 0100 0700 0800 0100 0900 0000 2f00 0100 0100 0000 052a b700 01b1 0000 0002 000a 0000 0006 0001 0000 0006 000b 0000 000c 0001 0000 0005 000c 000d 0000 0009 000e 000f 0001 0009 0000 0037 0002 0001 0000 0009 b200 0212 03b6 0004 b100 0000 0200 0a00 0000 0a00 0200 0000 0800 0800 0900 0b00 0000 0c00 0100 0000 0900 1000 1100 0000 0100 1200 0000 0200 13 */ /* Assembled code: Classfile /C:/java/BCEL/src/main/resources/compiled/ClassA.class Last modified 08.12.2019; size 563 bytes MD5 checksum bcd0198f6764a1dc2f3967fef701452e Compiled from "ClassA.java" public class com.apploidxxx.parse.ClassA minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #6.#20 // java/lang/Object."<init>":()V #2 = Fieldref #21.#22 // java/lang/System.out:Ljava/io/PrintStream; #3 = String #23 // Hello world #4 = Methodref #24.#25 // java/io/PrintStream.println:(Ljava/lang/String;)V #5 = Class #26 // com/apploidxxx/parse/ClassA #6 = Class #27 // java/lang/Object #7 = Utf8 <init> #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 LocalVariableTable #12 = Utf8 this #13 = Utf8 Lcom/apploidxxx/parse/ClassA; #14 = Utf8 main #15 = Utf8 ([Ljava/lang/String;)V #16 = Utf8 args #17 = Utf8 [Ljava/lang/String; #18 = Utf8 SourceFile #19 = Utf8 ClassA.java #20 = NameAndType #7:#8 // "<init>":()V #21 = Class #28 // java/lang/System #22 = NameAndType #29:#30 // out:Ljava/io/PrintStream; #23 = Utf8 Hello world #24 = Class #31 // java/io/PrintStream #25 = NameAndType #32:#33 // println:(Ljava/lang/String;)V #26 = Utf8 com/apploidxxx/parse/ClassA #27 = Utf8 java/lang/Object #28 = Utf8 java/lang/System #29 = Utf8 out #30 = Utf8 Ljava/io/PrintStream; #31 = Utf8 java/io/PrintStream #32 = Utf8 println #33 = Utf8 (Ljava/lang/String;)V { public com.apploidxxx.parse.ClassA(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 6: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/apploidxxx/parse/ClassA; public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC 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 8: 0 line 9: 8 LocalVariableTable: Start Length Slot Name Signature 0 9 0 args [Ljava/lang/String; } SourceFile: "ClassA.java */ 

, (, Jasmin) -.



, Jasmin . , , , JVM -.


:


Hello World
 .bytecode 52.0 .source Main.j .class public Main .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 2 .limit locals 2 getstatic java/lang/System/out Ljava/io/PrintStream; ldc "Hello world!" invokevirtual java/io/PrintStream.println(Ljava/lang/String;)V return .end method 

 ; ClassCreating.j .bytecode 52.0 .source ClassCreating.java .class public ClassCreating .super java/lang/Object .method public <init>()V .limit stack 1 .limit locals 1 .line 1 0: aload_0 1: invokespecial java/lang/Object/<init>()V 4: return .end method .method public static main([Ljava/lang/String;)V ; Flag ACC_VARARGS set, see JVM spec .limit stack 2 .limit locals 3 .line 3 0: new java/lang/String 3: dup 4: invokespecial java/lang/String/<init>()V 7: astore_1 .line 4 8: new ClassCreating 11: dup 12: invokespecial ClassCreating/<init>()V 15: astore_2 .line 5 16: aload_2 17: invokevirtual ClassCreating/sayHello()V .line 6 20: return .end method .method public sayHello()V .limit stack 2 .limit locals 1 .line 9 0: getstatic java/lang/System/out Ljava/io/PrintStream; 3: ldc "Hello, User!" 5: invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V .line 10 8: return .end method 



Hello World


- : gist.github


.


рд╕рд╛рд╣рд┐рддреНрдп рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛


  • The Java Virtual Machine Specification тАФ docs.oracle

Source: https://habr.com/ru/post/hi480550/


All Articles