首页 > 技术文章 > JVM 内部原理(七)— Java 字节码基础之二

richaaaard 2016-12-23 15:26 原文

JVM 内部原理(七)— Java 字节码基础之二

介绍

版本:Java SE 7

为什么需要了解 Java 字节码?

无论你是一名 Java 开发者、架构师、CxO 还是智能手机的普通用户,Java 字节码都在你面前,它是 Java 虚拟机的基础。

总监、管理者和非技术人员可以放轻松点:他们所要知道的就是开发团队在正在进行下一版的开发,Java 字节码默默的在 JVM 平台上运行。

简单地说,Java 字节码是 Java 代码(如,class 文件)的中间表现形式,它在 JVM 内部执行,那么为什么你需要关心它?因为如果没有 Java 字节码,Java 程序就无法运行,因为它定义了 Java 开发者编写代码的方式。

从技术角度看,JVM 在运行时将 Java 字节码以 JIT 的编译方式将它们转换成原生代码。如果没有 Java 字节码在背后运行,JVM 就无法进行编译并映射到原生代码上。

很多 IT 的专业技术人员可能没有时间去学习汇编程序或者机器码,可以将 Java 字节码看成是某种与底层代码相似的代码。但当出问题的时候,理解 JVM 的基本运行原理对解决问题非常有帮助。

在本篇文章中,你会知道如何阅读与编写 JVM 字节码,更好的理解运行时的工作原理,以及结构某些关键库的能力。

本篇文章会包括一下话题:

  • 如何获得字节码列表
  • 如何阅读字节码
  • 语言结构是如何被编译器映射的:局部变量,方法调用,条件逻辑
  • ASM 简介
  • 字节码在其他 JVM 语言(如,Groovy 和 Kotlin)中是如何工作的

目录

  • 为什么需要了解 Java 字节码?
  • 第一部分:Java 字节码简介
    • 基础
    • 基本特性
    • JVM 栈模型
      • 方法体里面是什么?
      • 局部栈详解
      • 局部变量详解
      • 流程控制
      • 算术运算及转换
      • new & &
      • 方法调用及参数传递
  • 第二部分:ASM
    • ASM 与工具
  • 第三部分:Javassist
  • 总结

ASM

ObjectWeb ASM 事实上是 Java 字节码分析和操作的标准。ASM 通过它面向访问者的 API 暴露 Java 类的内部聚合组件。API 本身不是很广泛 - 只需要使用一部分类,就可以实现几乎所有想要的。ASM 可以用来修改二进制字节码,以及生成新的字节码。例如,ASM 可以应用到新的编程语言(Groovy、Kotlin、Scala),将高级程序语言的语法编译成可供 JVM 执行的字节码。

“We didn’t even consider using anything else instead of ASM, because other projects at JetBrains use ASM successfully for a long time.”

– ANDREY BRESLAV, KOTLIN


My first touch with bytecode first hand was when I started helping in the Groovy project and by then we settled to ASM. ASM can do what is needed, is small and doesn’t try to be too smart to get into your way. ASM tries to be memory and performance effective. For example you don’t have to create huge piles of objects to create your bytecode. It was one of the first with support for invokedynamic btw. Of course it has its pro and con sides, but all in all I am happy with it, simply because I can get the job done using it.

– JOCHEN THEODOROU, GROOVY


I mostly know about ASM, just because it’s the one used by Groovy

推荐阅读