作者:小马快跑
Class字节码
Java 能做到 一次编译,到处运行,主要就是靠 class字节码 文件,也就是 java 文件经过编译之后 .java -> .class,然后再被 JVM 虚拟机加载。其实,不仅是 java 语言,只要是符合规则的 class 字节码文件,都可以被 JVM 加载,如 Grooy、Kolin 语言:

有了 class 字节码,也就解除了 VM虚拟机 与编程语言之间的耦合性。不管什么语言,只要是能编译成符合规则的字节码文件,就可以被 VM虚拟机 识别并加载到内存中。
class字节码构成
class字节码 中由无符号数和表两种数据结构组成。如:

- 无符号数:基本数据类型,
u1、u2、u4、u8分别表示1、2、4、8个字节的无符号数,无符号数可以用来表示数字、索引引用、数量只或者字符串(UTF-8编码)。 - 表:由多个
无符号数或者其他表作为数据项构成的复合数据类型,class文件中所有的表都以“_info”结尾。所以,整个Class文件可以认为就是一张表。
示例:
package org.ninetripods.lib_bytecode.asm.coreApi;
public class Test {
private int num = 0;
public void addNum() {
num++;
System.out.println("num:" + num);
}
public static int staticAdd(int a, int b) {
return a + b;
}
}
经过javac 编译之后,会生成Test.class字节码文件,用010 Editor打开这个文件:

上述的字节码看上去有点乱,但其实是按顺序排列的,整理信息如下:

如我们常见的字节码文件都是以CAFEBABE开头,表示VM虚拟机要加载的是class字节码;紧跟着的0000表示的主副版本,再往后面的0037,用十进制表示为55,对应JDK 11等等。
继续使用 javap -c xxx.class命令可以 输出分解后的 java字节码:

上述文件中描述了Test.class加载到内存时的执行顺序,包括各种描述符及操作码,接下面就来看一看它们。
类型描述符
基本类型描述符
每个基本类型都对应一个字母,如下:
| 基本类型 | 描述符 | <
|---|

Java的class字节码使得代码能在任何支持JVM的平台上运行。class文件由无符号数和表组成,包含方法描述符如基本类型、引用类型等。OpCode操作码用于JVM执行指令,例如new、invokevirtual等。文章还提到了AndroidFramework的相关知识点,如Handler、Binder、AMS等的核心概念。
最低0.47元/天 解锁文章
1698

被折叠的 条评论
为什么被折叠?



