(8) 深入理解Java Class文件格式(七)
转载:http://blog.csdn.net/zhangjg_blog/article/details/22091529
本专栏列前面的一系列博客, 对Class文件中的一部分数据项进行了介绍。 本文将会继续介绍class文件中未讲解的信息。 先回顾一下上面一篇文章。 在上一篇博客中, 我们介绍了:
- this_class 对当前类的描述
- super_class 对当前类的超类的描述
- interfaces_count 当前类直接实现的接口的数量或当前接口直接继承的接口的数量
- interfaces 对当前类或当前接口直接实现或继承的所有接口的描述
详细信息请移步至上一篇博客 深入理解Java Class文件格式(六)。 更多关于Java Class文件和JVM的文章请关注我的专栏深入理解Java语言 。
下面继续介绍class文件中的其他信息。
class文件中的fields_count和fields
(1)access_flags
其中access_flags占两个字节, 描述的是字段的访问标志信息。 这里就不在详细介绍了, 下面给出一张表格(该表格来自《深入Java虚拟机》):
标志位名称 | 值 | 含义 | 设定者 |
ACC_PUBLIC | 0x0001 | 字段被设为public | 类和接口 |
ACC_PRIVATE | 0x0002 | 字段被设为private | 类 |
ACC_PROTECTED | 0x0004 | 字段被设为protected | 类 |
ACC_STATIC | 0x0008 | 字段被设为static | 类和接口 |
ACC_FINAL | 0x0010 | 字段被设为final | 类和接口 |
ACC_VOLATILE | 0x0040 | 字段被设为volatile | 类 |
ACC_TRANSIENT | 0x0080 | 字段被设为transient | 类 |
(2)name_index
access_flags下面的两个字节是name_index, 这是一个指向常量池的索引, 它描述的是当前字段的字段名。 这个索引指向常量池中的一个CONSTANT_Utf8_info数据项。 这个CONSTANT_Utf8_info数据项中存放的字符串就是当前字段的字段名。
(3)descriptor_index
(4)attributes_count和attributes
- package com.jg.zhang;
- public class Programer extends Person{
- private Computer computer;
- public Programer(Computer computer){
- this.computer = computer;
- }
- public void doWork(){
- computer.calculate();
- }
- }
- Constant pool:
- .........
- .........
- #5 = Utf8 computer
- #6 = Utf8 Lcom/jg/zhang/Computer;
- .........
- .........
- {
- private com.jg.zhang.Computer computer;
- flags: ACC_PRIVATE
- .........
- .........
- }
从反编译的结果可以看出, 源文件中定义了一个Computer类型的字段computer, 并且是private的。 然后常量池中有这个字段的字段名和描述符。 其中常量池第五项的CONSTANT_Utf8_info是字段名, 第六项的CONSTANT_Utf8_info是该字段的描述符。这里有一点需要说明, 在反编译Programer.class时,由于computer是私有的, 要加- private选项, 否则的话, 虽然常量池中有字段引用信息, 但是不会输出字段信息, 即下面这两行不会输出:
- private com.jg.zhang.Computer computer;
- flags: ACC_PRIVATE
- javap -c -v -private -classpath . com.jg.zhang.Programer
class文件中的methods_count和methods
(1)access_flags
其中access_flags占两个字节, 描述的是方法的访问标志信息。 这里就不在详细介绍了, 下面给出一张表格(该表格来自《深入Java虚拟机》):
标志位名称 | 标志值 | 设定含义 | 设定者 |
ACC_PUBLIC | 0x0001 | 方法设为public | 类和接口 |
ACC_PRIVATE | 0x0002 | 方法设为private | 类 |
ACC_PROTECTED | 0x0004 | 方法设为protected | 类 |
ACC_STATIC | 0x0008 | 方法设为static | 类 |
ACC_FINAL | 0x0010 | 方法设为final | 类 |
ACC_SYNCHRONIZED | 0x0020 | 方法设为sychronized | 类 |
ACC_NATIVE | 0x0100 | 方法设为native | 类 |
ACC_ABSTRACT | 0x0400 | 方法设为abstract | 类和接口 |
ACC_STRICT | 0x0800 | 方法设为strictFP | 类和接口的<clinit>方法 |
(2)name_index
access_flags下面的两个字节是name_index, 这是一个指向常量池的索引, 它描述的是当前方法的方法名。 这个索引指向常量池中的一个CONSTANT_Utf8_info数据项。 这个CONSTANT_Utf8_info数据项中存放的字符串就是当前方法的方法名。
(3)descriptor_index
(4)attributes_count和attributes
- package com.jg.zhang;
- public class Programer extends Person{
- private Computer computer;
- public Programer(Computer computer){
- this.computer = computer;
- }
- public void doWork(){
- computer.calculate();
- }
- }
反编译之后, 常量池中会有如下信息(这里省略了大部分无关信息):
- Constant pool:
- .........
- #7 = Utf8 <init>
- #8 = Utf8 (Lcom/jg/zhang/Computer;)V
- .........
- #12 = Utf8 ()V
- .........
- #19 = Utf8 doWork
- {
- .........
- public com.jg.zhang.Programer(com.jg.zhang.Computer);
- flags: ACC_PUBLIC
- .........
- public void doWork();
- flags: ACC_PUBLIC
- .........
- }
由反编译结果可以看出, 该类中定义了两个方法, 其中一个是构造方法, 一个是doWork方法, 且这两个方法都是public的。 这两个方法的描述信息都存放在常量池。 其中第7项的CONSTANT_Utf8_info为构造方法的方法名, 第8项的CONSTANT_Utf8_info为构造方法的方法描述符, 第19项的CONSTANT_Utf8_info为doWork方法的方法名, 第12项的CONSTANT_Utf8_info为doWork方法的方法描述符。
总结
(8) 深入理解Java Class文件格式(七)的更多相关文章
- (6) 深入理解Java Class文件格式(五)
前情回顾 本专栏的前几篇博文, 对class文件中的常量池进行了详细的解释. 前文讲解了常量池中的7种数据项, 它们分别是: CONSTANT_Utf8_info CONSTANT_NameAndTy ...
- (5) 深入理解Java Class文件格式(四)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21658415 前情回顾 在上一篇博客深入理解Java Class文件格式(三) 中, ...
- (4) 深入理解Java Class文件格式(三)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21557357 首先, 让我们回顾一下关于class文件格式的之前两篇博客的主要内容. 在 ...
- (3) 深入理解Java Class文件格式(二)
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/21487287 在上一篇文章 深入理解Java Class文件格式(一) 中, 介绍了c ...
- (2) 深入理解Java Class文件格式(一)
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/21486985 Class文件在Java体系结构中的位置和作用 在上一篇博客中, 大致讲 ...
- 深入理解java虚拟机(七)类加载的时机
Class 文件中描述的各种信息都必须加载到虚拟机中才能运行和使用.而虚拟机怎么加载这些Class 文件呢?Class 文件进入到虚拟机中会发生什么变化呢? 虚拟机类加载机制是指 虚拟机把描述类的数据 ...
- 深入理解java虚拟机-第七章
第7章 虚拟机类加载机制 类的加载的时机 加载 Loading, 连接 Linking(验证 Verfiication, 准备Preparation, 解析 Resolution) 初始化 Initi ...
- 重读《深入理解Java虚拟机》七、探究Java内存模型
1.计算机物理内存结构(物理内存结构决定了虚拟机内存结构) 由于处理器和主存储设备在运算速度上不上同一个数量级上,因此处理器和主存储器之间不得不增设一层高速缓存,将部分在主存储设备的运算放在高速缓存内 ...
- 快速理解Java中的七种单例模式
饿汉式(推荐) package concurencyv2.chapter1; public class SingletonV2 { private static final SingletonV2 i ...
随机推荐
- SSH集成开发框架开发步骤
1. 环境搭建 a)添加Struts框架的支持 b)添加spring框架的支持(选中5个类库,且Copy类库到WEB-INF/lib目录下) c)在Eclipse 中,DataBase Explor ...
- mac下使用glew库,方法
mac下使用glew库,方法 分类: OpenGL2015-01-15 15:52 210人阅读 评论(0) 收藏 举报 目录(?)[+] 主要参考http://www.cnblogs.com ...
- jquery 取消绑定事件
$(".TreeView1_0").unbind("mouseover"); $("#id").attr("onclick&quo ...
- EmguCV 简单图形绘制
一.圆 public static void cvCircle( IntPtr img, System.Drawing.Point center, //Center of the circle int ...
- 【iCore3 双核心板】iCore3封装库及使用说明V1.0
iCore3封装库及使用说明下载链接: http://pan.baidu.com/s/1pLq23Qb iCore3 购买链接: https://item.taobao.com/item.htm?id ...
- SQL语句中count(1)count(*)count(字段)用法的区别
SQL语句中count(1)count(*)count(字段)用法的区别 在SQL语句中count函数是最常用的函数之一,count函数是用来统计表中记录数的一个函数, 一. count(1)和cou ...
- only for equality comparisons Hash Index Characteristics
http://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html Hash Index Characteristics Hash indexes ...
- grep中正则匹配的使用
如要匹配Computer或computer两个单词,可做如下操作: [Cc]mputer “.”允许匹配ASCII集中任意字符,或为字母,或为数字. 使用\{\}匹配模式结果出现的次数 匹配字母A出现 ...
- FP - growth 发现频繁项集
FP - growth是一种比Apriori更高效的发现频繁项集的方法.FP是frequent pattern的简称,即常在一块儿出现的元素项的集合的模型.通过将数据集存储在一个特定的FP树上,然后发 ...
- github 或者gitlab 设置添加SSH, 避免每次提交重复输入用户名
克隆项目二种方式: 1. 使用https url克隆, 复制https url 然后到 git clone https-url 2.使用 SSH url 克隆却需要在克隆之前先配置和添加好 SSH ...