深入浅析Java中类文件的数据类型

  介绍

深入浅析Java中类文件的数据类型?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一个常量池中的CONSTANT_Integer_info数据项,可以看做是CONSTANT_Integer类型的一个实例。它存储的是源文件中出现的int型数据的值。同样,作为常量池中的一种数据类型,它的第一个字节也是一个标记值,它的标签值为3,也就是说,当虚拟机读到一个标签值为3的数据项时,就知道这个数据项是一个CONSTANT_Integer_info,它存储的是int型数值的值。紧挨着标签的下面4个字节叫做字节,就是int型数值的整型值。它的内存布局如下:

深入浅析Java中类文件的数据类型

下面以示例代码进行说明,示例代码如下:

包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个字节叫做字节,就是浮点型的数值。它的内存布局如下:

深入浅析Java中类文件的数据类型

举例说明,如果源文件中的一句代码使用了一个浮动值,如下所示:

空白printFloat () {
  System.out.println(1234.5度);
  }

那么在这个类的常量池中就会有一个CONSTANT_Float_info与之相对应,这个CONSTANT_Float_info的形式如下:

深入浅析Java中类文件的数据类型

代码反编译结果如下:

常量池:
  ............
  ............
  # 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个字节叫做字节,就是长型的数值。它的内存布局如下:

深入浅析Java中类文件的数据类型