(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,用户可以对列表中每个元素的插入位置进行精确的控制.用户可以根据元素的整数索引(在列表中的位置) ...
随机推荐
- js去除中间空格
/ 功能: 1)去除字符串前后所有空格 // 2)去除字符串中所有空格(包括中间空格,需要设置第2个参数为:g) function Trim(str,is_global) { var result; ...
- JQuery-事件(部分)
/* 1. bind跟on是类似的方法,下面示例可相互替换 $('#click1').on('click',toYellow); // click绑定toYellow方法 $('#click1').o ...
- cocos2d-x-3.11.1 初使用
1. 引擎子系统包括: 世界编辑器.渲染系统.人机交互系统.动画系统.音频系统.物理引擎.网络接口 等 2. cocos2d-x 特点:开源的.跨平台的. cocos2d-x的发展过程: cocos2 ...
- J-LINK V8固件烧录指导
1 J-LINK V8固件烧录指导 J-LINK 是使用过程中,如果内部固件意外损坏或丢失,请参考下面操作步骤说明,重新烧录JLINK固件. 1.1 安装固件烧录软件 请ATMEL官方网址下载AT91 ...
- Android (二维码)关于java.lang.UnsatisfiedLinkError的小案例
在许多项目中我们都会用到第三方动态库.so文件,但是往往会引来很多烦恼,比如:Java.lang.UnsatisfiedLinkError - ::-/com.ishow.scan E/Android ...
- 一个编程小白,如何入门APP软件开发领域?
近些年,互联网创业火得不得了!一时间,满世界都在招做App软件开发的专业人员.从大众角度来看,学编程,写代码,是一件非常困难的事情.但是,App开发人员的工资那么诱人,让很多小白也跃跃欲试想学一下.那 ...
- SQL*Plus命令行工具连接Oracle数据库
1.在命令行中输入"sqlplus /nolog"即可启动该工具. 2.连接到Oracle服务器 conn 用户名/密码@服务器连接字符串 as 连接身份 客户端工具根据&quo ...
- Leetcode: Maximum XOR of Two Numbers in an Array
Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum re ...
- Hosts简单说明
Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统 ...
- 反射调用方法时的两种情况,走get set和不走get set
@Test public void test1() throws Exception{ //获取User类 Class class1=Class.forName("cn.jbit.bea ...