java字节码及ASM编程
- 方式:内容来自《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》
java字节码
Java 源文件经过 javac 编译器编译之后,将会生成对应的二进制文件。
每个合法的 Java 字节码文件都具备精确的定义,而正是这种精确的定义,才使得 Java 虚拟机得以正确读取和解释所有的 Java 字节码文件。
如最简单的helloworld
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
图示为javac编译的过程;java文件经过javac编译成class文件;class文件遵守java类定义规范;
可以在这里下载到完整的书籍
编译后的class文件可以被加载到jvm中运行;
下图为class文件的几个重要组成部分:
- Magic:一个 Java 字节码文件的前 4 个字节被称为它的魔数。每个正确的 Java 字节码文件都是以 0xCAFEBABE 开头的,这样保证了 Java 虚拟机能很轻松的分辨出 Java 文件和非 Java 文件。
- Version:该项存放了 Java 字节码文件的版本信息,它对于一个 Java 文件具有重要的意义。高版本的虚拟机可以处理低版本的文件;反之则不能处理
- Constant Pool:该项存放了类中各种文字字符串、类名、方法名和接口名称、final 变量以及对外部类的引用信息等常量。虚拟机必须为每一个被装载的类维护一个常量池,常量池中存储了相应类型所用到的所有类型、字段和方法的符号引用;
Access_flag:该项指明了该文件中定义的是类还是接口,同时还指名了类或接口的访问标志,如 public,private, abstract 等信息。访问标记定义如下:
ACC_PUBLIC:是否为public类型 ACC_PRIVATE:是否为private类型 ACC_PROTECTED:是否为protected类型 ACC_STATIC:是否为static类型 ACC_VOLATILE:是否为volatile类型 ACC_TRANSIENT:是否是transient类型 ACC_SYNTHETIC:是否是编译器自动生成 ACC_FINAL:是否是final ACC_SUPER:是否允许使用invokespecial的新语义;jdk1.0.2后一直为真 ACC_INTERFACE:是否是接口 ACC_ABSTRACE:是否是抽象类 ACC_SYNTHETIC:是否由用户代码生成 ACC_ANNOTATION:是否是注解 ACC_ENUM:是否是枚举类型
This Clas