(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 ...
随机推荐
- .net 新闻点击量修改,避免恶意刷新
DataTable dt = bll.GetNewsByID(id);//根据ID获取的新闻详细内容 if (dt != null && dt.Rows.Count > 0) { ...
- Thinkphp中自己组合的数据怎样使用框架的分页
做项目有时候,需要自己处理组合数据,不是直接从表中提取出来的.不能按照手册得方法分页显示数据.这时候就得想办法,正好看到他人的方法.地址为:http://www.thinkphp.cn/code/27 ...
- C++复制对象时勿忘每一部分
现看这样一个程序: void logCall(const string& funcname) //标记记录 { cout <<funcname <<endl; } cl ...
- svn服务配置和日常维护命令
Subversion独立服务和与apache整合服务. 一 .Svn独立服务安装 操作系统: Redhat Linux AS3 AS 4 ContOS AS 4 安装包获取: 下载[url]ht ...
- EmguCV+Win7+Visual C# 2012 配置
一.下载与安装OpenCV 安装包版本:OpenCV2.4.2 X86 下载地址:http://sourceforge.net/projects/opencvlibrary/files/opencv- ...
- 同时使用python2和Python3
问题:thrift生成的是python2代码,之前使用的是Python3因此需要同时使用两个版本. 方案:将python3的可执行文件重命名为python3(默认为Python),这样使用pyhton ...
- JS控制打印指定div
<html><head><script language="javascript">function printdiv(printpage){v ...
- Linux内核设计第七周 ——可执行程序的装载
Linux内核设计第七周 ——可执行程序的装载 第一部分 知识点总结 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 编译链接的过程 预处理阶段 gcc -E -o XX.cpp ...
- 土壤湿度传感器YL69使用
1.电源:3.3V ~ 5V 2.获取湿度信息的方式(2种可同时使用): 从传感器的D0引脚:土壤湿度大于某个阈值,则D0输出0,否则输出1 从传感器的A0引脚:获取到模拟量,更加精确.土壤湿度越大, ...
- ios 父VIew的宽度 等于较大view的宽度,并且垂直居中
白色view上面有两个子View,红色view和橙色view.白色view的宽度等于橙色view和红色view宽度较大的一个,并且橙色view和红色view垂直居中, Masonry布局如下: ...