一、概念
- JVM相对于class文件来说,就像操作系统。class文件相对于JVM来说,就像汇编语言机器语言
- 我们在写完一段java代码时候,其实简单的理解就是:java代码 -> class文件 -> jvm执行
- class文件并没有改变我们写的java代码,仅仅是在“格式”上做了适配,目的就是让jvm“认识”并且执行
- class文件是一个二进制文件
二、怎样去看一个class文件
方法一:使用IDEA插件BinED
通常我们看的都是16进制的,二进制没啥看的都是0和1。如下图是一个16进制的class文件
如上图:基本上所有的java代码转化成16进制,开头都是 “CA FE BA BE”,其实就是 Magic Number
方法二:IDEA安装jclasslib bytecode viewer插件
三、Class文件结构
其实通过IDEA去看一个class文件,能看出一个java类中所有的东西(构造方法,方法,属性等等,还有方法之间的调用关系等),比较重要的就是Class文件中包含了一个常量池,在编译期间就能确定很多东西。
Magic Number
魔数:其实就是看你这个文件是不是java文件
Minor Version 和 Major Version
简单理解为版本号
constant_pool_count
常量池数量(1~65536个),占用2个字节。
constant_pool
常量池:将我们的class文件翻译存储在常量池里面,方便以后使用
常量池中包含的内容:
- 字面量:文本、字符串、final修饰的内容(这些都是在编译的时候已经定好了)
- 符号引用:类、接口、字段、方法、一些明细信息(比如这个类叫做什么名字)
access_flags
用来判断当前java文件的修饰符是啥
ACC_PUBLIC、ACC_FINAL、ACC_SUPER、ACC_INTERFACE、ACC_ABSTRACT、ACC_SYNTHETIC、ACC_ANNOTATION、ACC_ENUM
this_class
当前的这个类是谁
super_class
当前类的父类是谁
interface_count
当前类实现的接口数量
interfaces
接口
fileds_count
当前类中的属性数量
fileds
当前类中的属性
methods_count
当前类中的方法数量
methods
当前类中的方法
attributes_count
额外/附加属性的数量
attributes
额外/附加属性