主页 > 知识库 > 网络编程 > JSP/Java >

Java字节码文件剖析

来源:中国IT实验室 作者:佚名 发表于:2013-07-10 13:07  点击:
Java为什么能够支持跨平台,其实关键就是在于其*.class字节码文件,因为*.class字节码文件有一个统一标准的规范,里面是JVM运行的时需要的相关指令,各家的JVM必须能够解释编译执行标准字节码文件,因此Java是一种跨平台语言,再想想C++/C等语言为什么不是跨
 Java为什么能够支持跨平台,其实关键就是在于其*.class字节码文件,因为*.class字节码文件有一个统一标准的规范,里面是JVM运行的时需要的相关指令,各家的JVM必须能够解释编译执行标准字节码文件,因此Java是一种跨平台语言,再想想C++/C等语言为什么不是跨平台的,就是因为其源文件经过编译后生成的就是针对特定机器的汇编代码  字节码文件解析
  在解析之前最好下载一个工具方便查看(Bytecode viewer),当然也可以不用下载,直接使用JDK自带的命令如javap –c –s –l –verbose (字节码文件去掉扩展名)
  一个简单的程序
  [java]
  public class Test {
  private static final int MAX_COUNT=1000;
  private static int count=0;
  public int bar() throws Exception{
  if(++count>=MAX_COUNT){
  count=0;
  throw new Exception("count overflow");
  }
  return count;
  }
  }
  public class Test {
  private static final int MAX_COUNT=1000;
  private static int count=0;
  public int bar() throws Exception{
  if(++count>=MAX_COUNT){
  count=0;
  throw new Exception("count overflow");
  }
  return count;
  }
  }运行工具软件查看得下图:
\
  看到了吧,一个字节码文件由6部份组成,先看第一部份General Information,这一部份中说明了JDK使用的版本号Major version=51表示使用的是JDK 7,Minor version=0表示的是次版本号,这也限制了运行此字节码文件需要的最低JDK版本号,不信你可以试试下面这条语句,其实就是从字节码文件中获取到 class的版本号
  [java]
  System.out.println(System.getProperty("java.class.version"));
  System.out.println(System.getProperty("java.class.version"));下面是 constant pool=35,常量池中存放着类中定义的所有常量,大致包括类名,方法名,特征符以及字符串等,Access flag=0x0021[public]表识该类的访问权限,This class=cp_info_#1其中cp是const pool的缩写,表示这个类的信息保存在了1号常量池中,下面讲到constant pool时再说,super class=cp_info_#3也表示同一个意思,Interface count=0表示类没有实现接口,Fields count=2说明类中定义了两个成员变量,不信你看看刚才的源文件是不是有两个变量,Methods count=3表明类中定义的方法数是3(clinit对静态变量进行赋值由JVM调用, init为类的构造函数 bar用户自定义函数),Attribute count=1表示是类格式属性看看常量池如下,不截图了
  [java]
  [01] CONSTANT_Class_info
  Classname:cp_info_#2
  表示Classname存放在2号常量池中
  [02] CONSTANT_Utf8_info
  Length of byte array :4
  Length of string:4
  String: Test
  [01] CONSTANT_Class_info
  Classname:cp_info_#2
  表示Classname存放在2号常量池中
  [02] CONSTANT_Utf8_info
  Length of byte array :4
  Length of string:4
  String: Test

有帮助
(0)
0%
没帮助
(0)
0%