java字节码及ASM编程

本文介绍了Java字节码的结构,包括魔数、版本信息、常量池等关键部分。同时,探讨了ASM这一Java字节码操纵框架,用于动态生成类或增强已有类的功能。ASM的核心类包括ClassReader、ClassAdapter和ClassWriter,它们在字节码生成和转换过程中起到关键作用。文章还列举了一些常用的Java操作码,并展示了ASM如何在实际编码中应用。
摘要由CSDN通过智能技术生成

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.png

图示为javac编译的过程;java文件经过javac编译成class文件;class文件遵守java类定义规范;

可以在这里下载到完整的书籍

编译后的class文件可以被加载到jvm中运行;

下图为class文件的几个重要组成部分:

helloworld

  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值