# jjvm **Repository Path**: guyongchang/jjvm ## Basic Information - **Project Name**: jjvm - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-04 - **Last Updated**: 2025-12-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 当然可以!虽然你没有明确指出是哪本书,但从你的代码结构(包名如 mc.jyc、类名如 ClassReader、ConstantPool、MObject、PUT_STATIC 等)以及实现细节来看,你正在学习或复现《自己动手写 Java 虚拟机》(作者:张秀宏)一书的内容。这本书的前六章正是围绕一个简易 JVM 解释器的核心组件展开。 下面是对 《自己动手写 Java 虚拟机》前六章内容的精炼总结: 📘 第一章:命令行工具与类路径(Classpath) 实现简单的命令行参数解析(如 -Xjre、-cp)。 构建类路径(Classpath),支持从 JRE 的 rt.jar 和用户自定义路径加载 .class 文件。 使用 ZipFile 读取 JAR 包中的类文件。 ✅ 核心目标:让 JVM 能找到并读取 .class 字节码文件。 📘 第二章:类文件解析(Class File Structure) 解析 JVM 类文件的二进制结构(符合 JVMS §4)。 实现 ClassReader 读取字节流。 解析魔数、版本号、常量池、访问标志、this_class、super_class、接口、字段、方法、属性等。 常量池支持主要类型:Utf8、Integer、Float、Long、Double、Class、String、FieldRef、MethodRef、NameAndType 等。 ✅ 核心目标:将 .class 文件转换为内存中的结构化数据(ClassFile 对象)。 📘 第三章:运行时数据区(Runtime Data Areas) 实现 JVM 运行时内存模型的关键部分: PC 寄存器:记录当前执行指令地址。 Java 虚拟机栈:每个线程一个,由 Frame(栈帧)组成。 局部变量表(LocalVars):基于 Slot 数组,支持基本类型和引用。 操作数栈(OperandStack):用于指令计算。 方法区(Method Area):用 MClass 表示已加载的类。 堆(Heap):用 MObject 表示对象实例。 ✅ 核心目标:为字节码执行提供内存支持。 📘 第四章:指令集解释器(Interpreter & Instructions) 实现一个基于 switch-case 或查表法的解释器循环。 实现大量字节码指令,分为几大类: 常量指令:ICONST, BIPUSH, LDC 等。 加载/存储指令:ILOAD, ISTORE, ALOAD, ASTORE 等。 栈操作指令:POP, DUP, SWAP 等。 算术/逻辑/比较指令:IADD, ISUB, IFEQ 等。 控制转移指令:GOTO, IF_ICMPEQ 等。 每条指令封装为一个类(如 IADD),实现 execute(Frame) 方法。 ✅ 核心目标:让 JVM 能逐条执行字节码。 📘 第五章:类加载与链接(Class Loading & Linking) 实现类加载器(ClassLoader): 支持数组类和普通类。 递归加载父类、接口。 实现运行时常量池(ConstantPool): 将类文件常量池中的符号引用(如 FieldRef)转换为运行时引用。 实现字段(Field)和方法(Method)的运行时表示。 初步支持字段解析(FieldRef.resolvedField())。 ✅ 核心目标:让 JVM 能动态加载类,并解析符号引用。 📘 第六章:对象与方法调用(Objects & Method Invocation) 实现 new 指令:创建 MObject 实例,分配字段内存(Slots)。 实现字段访问指令: GET_FIELD / PUT_FIELD:操作实例字段。 GET_STATIC / PUT_STATIC:操作静态字段(需类初始化)。 实现方法调用指令(初步): INVOKE_SPECIAL:用于构造函数 和私有方法。 (注:INVOKE_VIRTUAL 和 INVOKE_INTERFACE 通常在第七章及以后) ✅ 核心目标:支持面向对象的基本特性——对象创建、字段访问、方法调用。 🧩 前六章整体脉络 阶段 目标 关键能力 ------ ------ -------- 1–2 章 读取字节码 能解析 .class 文件结构 3–4 章 执行字节码 能运行简单静态方法(无对象) 5–6 章 支持面向对象 能创建对象、访问字段、调用构造函数 到第六章结束,你的 JVM 已经可以运行类似这样的代码: java public class MyObject { static int staticVar; int instanceVar; public MyObject() { instanceVar = 100; } public static void main(String[] args) { staticVar = 32768; MyObject obj = new MyObject(); obj.instanceVar = 200; } } 。 下一步(第七章预告) 实现完整的 类初始化机制() 支持 虚方法调用(INVOKEVIRTUAL)→ 方法表(vtable) 异常处理、数组、字符串等高级特性 希望这个总结对你有帮助!你已经完成了 JVM 最核心、最困难的基础搭建工作,继续加油!💪