1.简述

    java语言具有一处编译,到处运行,该功能实现原理是基于class文件实现的,java格式文件经过编译后生成class文件,jvm加载class文件进行运行,不管什么格式的文件只要能编译成符合规范的class文件,那么就可以在jvm上运行。所以下面研究字节码文件格式。

2.字节码文件格式

package com.xiayu.demo;

public class ClassFile {

    private int field;

    public void method(){
        String a = "test";
        String b = new String("b");
        System.out.println("method()");
    }
}

对应的字节码16进制显示

字节码文件是由魔数,版本号,常量池,访问标志,类索引,父类索引,接口索引,字段表集合,方法,属性组成。

  • 魔数: 4个字节,对应的是16进制的cafe babe,其是表明class文件的标志,class文件也可以通过class后缀来表示,但后缀可以修改,魔数在文件内容上表明该文件是class文件
  • 版本号:上图0000 0034,0000代表次版本号,0034代表主版本号(52),52对应1.8.
  • 常量池:常量池主要包含字面量和符号引用,字面量如文本字符串,final声明的变量等,符号引用主要是类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。如上图字节码文件中:0x0021(33)代表常量池中常量的数量,实际上只有32个常量。

    常量池中的信息

  • 访问标志 Access_flag
    声明class文件是类还是接口,访问控制权限是public abstract 还是protected等等。
  • 类索引、父类索引和接口索引等
  • 方法
     
    构造方法
     

     
    method()方法
     

上述仅仅为字节码的简要描述,更多可以参考官方文档或者使用java自带javap工具进行查看字节码文件内容.

3.字节码指令

来自

    字节码指令主要包含加载存储指令,运算指令、类型转换指令、对象创建与访问指令、操作数栈管理指令、控制转移指令、方法调用和返回指令、异常处理指令和同步指令等。

4.泛型的字节码

举例

public <T> T sum(T a,T b){
    System.out.println(a);
    System.out.println(b);
    return b;
}

    对应的字节码,通过字节码文件可以看到泛型在字节码文件中具体的类型是Object类型。

03-05 22:29