深入浅析Java中类文件的数据类型?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
一个常量池中的CONSTANT_Integer_info数据项,可以看做是CONSTANT_Integer类型的一个实例。它存储的是源文件中出现的int型数据的值。同样,作为常量池中的一种数据类型,它的第一个字节也是一个标记值,它的标签值为3,也就是说,当虚拟机读到一个标签值为3的数据项时,就知道这个数据项是一个CONSTANT_Integer_info,它存储的是int型数值的值。紧挨着标签的下面4个字节叫做字节,就是int型数值的整型值。它的内存布局如下:
下面以示例代码进行说明,示例代码如下:
包com.bjpowernode.test; 公开课TestInt { 空白printInt () { System.out.println (65535); } }
将上面的类生成的类文件反编译:
1. d: \ Workspace \ AndroidWorkspace \ BlogTest \ bin> javap -v -c -classpath 只com.bjpowernode.test.TestInt ,
下面列出反编译的结果,由于反编译结果较长,我们省略了大部分信息:
.................. .................. 常量池: .................. .................. # 21=整数65535 .................. .................. { .................. .................. 空白printInt (); 国旗: 代码: 堆栈=2,当地人=1,args_size=1 0:getstatic # 15/java/lang/system . out/字段:Ljava/io/PrintStream; 3:ldc # 21//整数65535 5:invokevirtual # 22/java/方法/io/PrintStream.println: (I) V 8:返回 LineNumberTable: 第6行:0 第7行:8 LocalVariableTable: 开始长槽的名字签名 0 9 0这Lcom/bjpowernode/测试/TestInt; }
上面的输出结果中,保留了printInt方法的反编译结果,并且保留了常量池中的第21项。首先看printInt方法反编译结果中的索引为3的字节码指令:
1.3:, ldc ,,,,,,,,,, # 21,,,,,,,,,,,,,,,,,//, int 65535,,
这条ldc指令,引用了常量池中的第21项,而第21项是一个CONSTANT_Integer_info,并且这个CONSTANT_Integer_info存储的整型值为65535只;
一个常量池中的CONSTANT_Float_info数据项,可以看做是CONSTANT_Float类型的一个实例。它存储的是源文件中出现的浮点型数据的值。同样,作为常量池中的一种数据类型,它的第一个字节也是一个标记值,它的标签值为4,也就是说,当虚拟机读到一个标签值为4的数据项时,就知道这个数据项是一个CONSTANT_Float_info,并且知道它存储的是浮点型数值。紧挨的着标签下面4个字节叫做字节,就是浮点型的数值。它的内存布局如下:
举例说明,如果源文件中的一句代码使用了一个浮动值,如下所示:
空白printFloat () { System.out.println(1234.5度); }
那么在这个类的常量池中就会有一个CONSTANT_Float_info与之相对应,这个CONSTANT_Float_info的形式如下:
代码反编译结果如下:
常量池: ............ ............ # 29 f=1234.5浮动 ........... ........... { ............ ............ 空白printFloat (); 国旗: 代码: 堆栈=2,当地人=1,args_size=1 0:getstatic # 15/java/lang/system . out/字段:Ljava/io/PrintStream; 3:ldc # 29//浮动1234.5 f 5:invokevirtual # 30/java/方法/io/PrintStream.println: V (F) 8:返回 LineNumberTable: 10号线:0 第11行:8 LocalVariableTable: 开始长槽的名字签名 0 9 0这Lcom/bjpowernode/测试/TestInt; }
一个常量池中的CONSTANT_Long_info数据项,可以看做是CONSTANT_Long类型的一个实例。它存储的是源文件中出现的长型数据的值。同样,作为常量池中的一种数据类型,它的第一个字节也是一个标记值,它的标签值为5,也就是说,当虚拟机读到一个标签值为5的数据项时,就知道这个数据项是一个CONSTANT_Long_info,并且知道它存储的是长型数值。紧挨着标签的下面8个字节叫做字节,就是长型的数值。它的内存布局如下: