zoukankan      html  css  js  c++  java
  • JVM-class文件完全解析-方法表集合

     方法表集合

       前面的魔数,次版本号,主板本号,常量池入口,常量池,访问标志,类索引,父类索引,接口索引集合,字段表集合,那么再接下来就是方法表了. 

     

      方法表的构造如同字段表一样,依次包括了访问标志(access_flags),名称索引(name_index),描述符索引(descriptor_index),属性表集合(attributes)几项.

      方法表结构:  

    类型 名称 数量
    u2 access_flags 1
    u2 name_index 1
    u2 descriptor_index 1
    u2 attributes_count 1
    attribute_info attributes attributes_count

      方法访问标志:

    标志名称 标志值 含义
    ACC_PUBLIC 0x00 01 方法是否为public
    ACC_PRIVATE 0x00 02 方法是否为private
    ACC_PROTECTED 0x00 04 方法是否为protected
    ACC_STATIC 0x00 08 方法是否为static
    ACC_FINAL 0x00 10 方法是否为final
    ACC_SYHCHRONRIZED 0x00 20 方法是否为synchronized
    ACC_BRIDGE 0x00 40 方法是否是有编译器产生的方法
    ACC_VARARGS 0x00 80 方法是否接受参数
    ACC_NATIVE 0x01 00 方法是否为native
    ACC_ABSTRACT 0x04 00 方法是否为abstract
    ACC_STRICTFP 0x08 00 方法是否为strictfp
    ACC_SYNTHETIC 0x10 00 方法是否是有编译器自动产生的

      方法里的Java代码,经过编译器编译成字节码指令后,存放在方法属性表集合中一个名为"Code"的属性里面,属性表作为calss文件格式中最具扩展的一种数据项目.

      在Java语言中,要重载一个方法,除了要与原方法具有相同的简单名称之外,还要求必须拥有一个与原方法不同的签名,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,也就是因为返回值不会包含在特征签名中,因此Java语言里面是无法仅仅靠返回值的不同来堆一个已有方法进行重载的.但是在class文件格式中,特征签名的范围更大一些,只要描述符不是完全一致的两个方法也可以共存.也就是说,如果两个方法有相同的名称和特征签名,但是返回值不同,那么也是可以合法共存与同一个class文件中的.

     下面继续前面分析的class文件

      源文件:

      

      javap分析的常量池:

      

      class文件分析:

      

      直接看方法表部分(有点乱),首先是右下角的methods_count:0x00 02表示方法集中有两个方法.access_flags:0x00 01表示访问标志值为1,对应上面的方法访问标志表的public,在看源文件的方法确实是public.name_index:0x00 07表示方法的名称索引为7,对应上面的常量池7,为"<init>".decriptor_index:0x00 08代表描述符索引值为8,对应上面常量池的"()v".attributes_count:0x00 01代表此方法的属性表集合有一项属性,属性的名称索引为0x00 09,对应上面常量池9为"code ",说明此属性是方法的字节码描述.

  • 相关阅读:
    大二下第十三周学习笔记
    对C++多态的一次小分析
    vs2015中用汇编(转)
    挖个坑
    ListCtrl
    获得进程完整路径的第二种方法
    The Meeting Place Cannot Be Changed(二分+eps精度)
    CodeForces 494A
    Anya and Ghosts CodeForces
    寒假给自己立个flag
  • 原文地址:https://www.cnblogs.com/lrh-xl/p/5351059.html
Copyright © 2011-2022 走看看