(5) 深入理解Java Class文件格式(四)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21658415
前情回顾
- CONSTANT_Utf8_info
- CONSTANT_NameAndType_info 。
常量池中各数据项类型详解(续)
(3)CONSTANT_Integer_info
- package com.jg.zhang;
- public class TestInt {
- void printInt(){
- System.out.println(65535);
- }
- }
将上面的类生成的class文件反编译:
- D:\Workspace\AndroidWorkspace\BlogTest\bin>javap -v -c -classpath . com.jg.zhang.TestInt
下面列出反编译的结果, 由于反编译结果较长, 我们省略了大部分信息:
- ..................
- ..................
- Constant pool:
- ..................
- ..................
- #21 = Integer 65535
- ..................
- ..................
- {
- ..................
- ..................
- void printInt();
- flags:
- Code:
- stack=2, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc #21 // int 65535
- 5: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
- 8: return
- LineNumberTable:
- line 6: 0
- line 7: 8
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 9 0 this Lcom/jg/zhang/TestInt;
- }
上面的输出结果中, 保留了printInt方法的反编译结果, 并且保留了常量池中的第21项。 首先看printInt方法反编译结果中的索引为3 的字节码指令:
- 3: ldc #21 // int 65535
这条ldc指令, 引用了常量池中的第21项, 而第21项是一个CONSTANT_Integer_info, 并且这个CONSTANT_Integer_info存储的整型值为65535 。
(4)CONSTANT_Float_info
- void printFloat(){
- System.out.println(1234.5f);
- }
那么在这个类的常量池中就会有一个CONSTANT_Float_info与之相对应, 这个CONSTANT_Float_info的形式如下:
- Constant pool:
- .............
- .............
- #29 = Float 1234.5f
- ............
- ............
- {
- ............
- ............
- void printFloat();
- flags:
- Code:
- stack=2, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc #29 // float 1234.5f
- 5: invokevirtual #30 // Method java/io/PrintStream.println:(F)V
- 8: return
- LineNumberTable:
- line 10: 0
- line 11: 8
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 9 0 this Lcom/jg/zhang/TestInt;
- }
(5)CONSTANT_Long_info
- void printLong(){
- System.out.println(123456L);
- }
- Constant pool:
- ..............
- ..............
- #21 = Long 123456l
- ..............
- ..............
- {
- ..............
- ..............
- void printLong();
- flags:
- Code:
- stack=3, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc2_w #21 // long 123456l
- 6: invokevirtual #23 // Method java/io/PrintStream.println:(J)V
- 9: return
- LineNumberTable:
- line 7: 0
- line 8: 9
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 10 0 this Lcom/jg/zhang/TestInt;
- }
(6)CONSTANT_Double_info
- void printDouble(){
- System.out.println(123456D);
- }
- Constant pool:
- ..............
- ..............
- #21 = Double 123456.0d
- ..............
- ..............
- {
- ..............
- ..............
- void printDouble();
- flags:
- Code:
- stack=3, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc2_w #21 // double 123456.0d
- 6: invokevirtual #23 // Method java/io/PrintStream.println:(D)V
- 9: return
- LineNumberTable:
- line 7: 0
- line 8: 9
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 10 0 this Lcom/jg/zhang/TestInt;
- }
(7) CONSTANT_String_info
- void printStrng(){
- System.out.println("abcdef");
- }
- Constant pool:
- ..............
- ..............
- #21 = String #22 // abcdef
- #22 = Utf8 abcdef
- ..............
- ..............
- {
- ..............
- ..............
- void printStrng();
- flags:
- Code:
- stack=2, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc #21 // String abcdef
- 5: invokevirtual #23 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
- 8: return
- LineNumberTable:
- line 7: 0
- line 8: 8
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 9 0 this Lcom/jg/zhang/TestInt;
- }
其中printString方法中索引为3的字节码指令ldc引用常量池中的第21项, 第21项是一个CONSTANT_String_info, 这个位于第21项的CONSTANT_String_info又引用了常量池的第22项, 第22项是一个CONSTANT_Utf8_info, 这个CONSTANT_Utf8_info中存储的字符串是 abcdef 。 引用关系的内存布局如下:
总结
- CONSTANT_Class_info
- CONSTANT_Fieldref_info
- CONSTANT_Methodref_info
- CONSTANT_InterfaceMethodref_info
(5) 深入理解Java Class文件格式(四)的更多相关文章
- (8) 深入理解Java Class文件格式(七)
转载:http://blog.csdn.net/zhangjg_blog/article/details/22091529 本专栏列前面的一系列博客, 对Class文件中的一部分数据项进行了介绍. 本 ...
- (6) 深入理解Java Class文件格式(五)
前情回顾 本专栏的前几篇博文, 对class文件中的常量池进行了详细的解释. 前文讲解了常量池中的7种数据项, 它们分别是: CONSTANT_Utf8_info CONSTANT_NameAndTy ...
- (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集合】(四)——集合 Queue
今天我们来介绍下集合Queue中的几个重要的实现类.关于集合Queue中的内容就比较少了.主要是针对队列这种数据结构的使用来介绍Queue中的实现类. Queue用于模拟队列这种数据结构,队列通常是指 ...
- 重读《深入理解Java虚拟机》四、虚拟机如何加载Class文件
1.Java语言的特性 Java代码经过编译器编译成Class文件(字节码)后,就需要虚拟机将其加载到内存里面执行字节码所定义的代码实现程序开发设定的功能. Java语言中类型的加载.连接(验证.准备 ...
- 深入理解java虚拟机(四)垃圾收集算法及HotSpot实现
垃圾收集算法 一般来说,垃圾收集算法分为四类: 标记-清除算法 最基础的算法便是标记-清除算法(Mark-Sweep).算法分为“标记”和“清除”两个阶段:首先标记处需要收集的对象,在标记完成之后,再 ...
- 深入理解JAVA集合系列四:ArrayList源码解读
在开始本章内容之前,这里先简单介绍下List的相关内容. List的简单介绍 有序的collection,用户可以对列表中每个元素的插入位置进行精确的控制.用户可以根据元素的整数索引(在列表中的位置) ...
随机推荐
- DBHelper.java(数据库连接类)
package com.vcredit.ddcash.batch.util; import java.sql.Connection;import java.sql.DriverManager;impo ...
- find exec 运用
实例1:ls -l命令放在find命令的-exec选项中 : find . -type f -exec ls -l {} \; 实例2:在目录中查找更改时间在n日以前的文件并删除它们: find . ...
- EmguCV 轮廓分析函数汇总
一.cvApproxPoly 使用多边形逼近一个轮廓,使得顶点数目变少.算法先从轮廓选择2个最远的点,然后将2个连成一个线段,然后再查找轮廓上到线段距离最远的点,添加到逼近后的新轮廓.算法反复迭代,不 ...
- Linux下动态库(.so)和静态库(.a) 的区别
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.编译之后程序文件大,但加载快,隔离性也好.动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还 ...
- innodb_buffer_pool_size 大小建议
innodb_buffer_pool_size参数大小建议: 查看Innodb_buffer_pool_pages_data大小,即已使用页面 MySQL> SHOW GLOBAL STATUS ...
- 当select框变化时 获取select框中被选中的值
DOM <select name="course"> <option value="1">1</option> <op ...
- jqGrid预定义的格式化类型formatter
下表列出了jqGrid中的预定义格式化类型 所有预定义类型和编辑模式兼容,就是说数字,链接和email等需要转换,才能使他们被正确编辑 类型 选项(默认值参考语言选项) 描述 integer thou ...
- 部署移动BI必须要考虑的五大因素
随着大屏智能手机和平板电脑的普及,商业智能分析应用程序也需要移动化.由于用户并不会长时间在办公桌前工作.在新的设备以及新的用户的共同促进下,移动BI即将成为主流. 但是,所有人都应该清楚这样一个事实: ...
- fmt-重新格式化段落
fmt供用户切分段落,使文本行数不要超出我们看到的屏幕范围. 如果电脑没有fmt(不是posix),需要安装coreutils包. 常用选项有两个: -s 切割较长的行,但不会将短行结合成较长的行. ...
- tomcat access log 参数
%a - 客户端IP地址 %A - 本机IP地址 %b - 发送字节数,不含HTTP头 如果为空是 '-' %B - 同上 %h - 客户端机器名 (如果connector的enableLookup ...