class类分析

img


  • class类的组成

    • 魔数(Magic)
    • 版本号(Version)
    • 常量池(constant_pool)
    • 访问标志(access_flag)
    • 当前类索引(this_class)
    • 父类索引(super_class)
    • 接口索引 (interfaces)
    • 字段表(fields)
    • 方法表(methods)
    • 附加属性(attributes)

  • 魔数(Magic)

    一个class文件的魔数不会改变
    在开头    0xCAFEBABE
    jvm是靠魔数判断是不是一个class
  • 版本号(Version)

    • 副版本号(minor_version)

    • 主版本号(major_version)

      版本号是jvm判断class类能不能被正常执行
      class类的版本号必须在jvm所支持的版本号内才能正常执行
  • 常量池(constant_pool)

    • 常量池计数器(constant_pool_count)

    • 常量池(constant_pool[])

      计数器是常量池的个数加一
      常量池
      例如:class数据
      
      					  00 13 0A 00 03 00 10 07  .......4........
      00 11 07 00 12 01 00 01 61 01 00 01 49 01 00 01  ........a...I...
      62 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 56  b...<init>...()V
      01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E 75  ...Code...LineNu
      6D 62 65 72 54 61 62 6C 65 01 00 12 4C 6F 63 61  mberTable...Loca
      6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 01 00  lVariableTable..
      04 74 68 69 73 01 00 09 4C 63 6F 6D 2F 41 41 41  .this...Lcom/AAA
      3B 01 00 0A 53 6F 75 72 63 65 46 69 6C 65 01 00  ;...SourceFile..
      08 41 41 41 2E 6A 61 76 61 0C 00 07 00 08 01 00  .AAA.java.......
      07 63 6F 6D 2F 41 41 41 01  00 10 6A 61 76 61 2F  .com/AAA...java/
      6C 61 6E 67 2F 4F 62 6A 65 63 74
      
      00 13 代表19   说明常量池有18个数据
      1:0A 00 03 00 10                         #3.#16
      2:07 00 11                               #17
      3:07 00 12                               #18
      4:01 00 01 61                            a 
      5:01 00 01 49                            I
      6:01 00 01 62                            b
      7:01 00 06 3C 69 6E 69 74 3E             <init>
      8:01 00 03 28 29 56 				   ()V
      9:01 00 04 43 6F 64 65                   Code
      10:01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65       LineNumberTable
      11:01 00 12 4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65  LocalVariableTable
      12:01 00 04 74 68 69 73                  this 
      13:01 00 09 4C 63 6F 6D 2F 41 41 41 3B    Lcom/AAA
      14:01 00 0A 53 6F 75 72 63 65 46 69 6C 65   SourceFile
      
      15:01 00 08 41 41 41 2E 6A 61 76 61        AAA.java
      16:0C 00 07 00 08                          #7:#8
      17:01 00 07 63 6F 6D 2F 41 41 41           com/AAA
      18:01  00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74   java/lang/Object
  • 访问标志(access_flags)

    描述类或者接口的访问限权
  • 类索引(this_class)

    为常量池中的某一项有效索引值
  • 父类索引(super_class)

    要么是0 要么是常量池中的有效索引值
  • 接口计数器(interfaces_count)

    表示单当前类或接口的直接超接口数量
  • 接口表(interfaces[])

    每个成员必须是常量池中某项的有效索引值
  • 字段计数器(fields_count)

    表示class文件的fielda表的个数
  • 字段表(fields[])

    当前类或接口中的字段的完整描述,不包括从父类或父接口继承的字段
  • 方法计数器(methods_count)

  • 方法表

  • 属性计数器

  • 属性表


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

基本数据类型 上一篇
数组 下一篇