JVM-class文件完全解析-方法表集合
2016-04-04 08:41
281 查看
方法表集合
前面的魔数,次版本号,主板本号,常量池入口,常量池,访问标志,类索引,父类索引,接口索引集合,字段表集合,那么再接下来就是方法表了.方法表的构造如同字段表一样,依次包括了访问标志(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语言中,要重载一个方法,除了要与原方法具有相同的简单名称之外,还要求必须拥有一个与原方法不同的签名,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,也就是因为返回值不会包含在特征签名中,因此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 ",说明此属性是方法的字节码描述.
相关文章推荐
- Cache选型的一些思考
- ACM题集以及各种总结大全!
- AWT基本组件(1)
- for循环,while循环,do while循环
- 数据结构——堆栈和队列
- WeakHashMap和HashMap的区别
- Java对象的引用与垃圾回收
- 第六周 技术博客
- 算法练习-背包问题
- 最短路&差分约束题集
- XCode 7.2,7.2.1和7.3的360云盘链接
- 【codevs 1082】线段树练习3
- Timer与AlarmManager的差别
- 中低端的路由器在局域网内的数据传输速度
- web开发技术点解析
- [web问题解决]本地服务器无法打开html文档 表单传入数据库报错
- MMO游戏技能攻击区域的计算2--给地图划分格子
- 甲骨文的 Linux 部门主管 Coekaerts 跳槽到微软
- 算法备忘录——排序
- 屌丝的常用排序-----one