diff --git a/README.md b/README.md index 4b55e2c..7bce1fc 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,10 @@ ```java public class Demo5 { + static { + System.out.println("Demo5 类被加载了"); + } + public static void main(String[] args) { String str = method1("hello world"); method1(str); @@ -71,11 +75,65 @@ public class Demo5 { System.out.println(s); return "你好 世界"; } - + } ``` -每一个 `匚` 结构图形,都表示一个 JVM 线程栈中的栈帧 -![](/readme/20230721204333.png) +使用 haidnorJVM 运行以上程序将会在控制台输出以下内容。每一个 `匚` 结构图形,都表示一个 JVM 线程栈中的栈帧 +```cmd +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - ┌──────────────────[1] haidnor.jvm.test.demo.Demo5 | static void () +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 0 GETSTATIC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 3 LDC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 5 INVOKEVIRTUAL +Demo5 类被加载了 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 8 RETURN +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - └──────────────────[1] haidnor.jvm.test.demo.Demo5 | static void () +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - ┌──────────────────[1] haidnor.jvm.test.demo.Demo5 | public static void main(String[] args) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 0 LDC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 2 INVOKESTATIC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ ┌──────────────────[2] haidnor.jvm.test.demo.Demo5 | public static String method1(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ 0 ALOAD_0 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ 1 INVOKESTATIC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ ┌──────────────────[3] haidnor.jvm.test.demo.Demo5 | public static String method2(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ 0 ALOAD_0 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ 1 INVOKESTATIC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ ┌──────────────────[4] haidnor.jvm.test.demo.Demo5 | public static String method3(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 0 GETSTATIC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 3 ALOAD_0 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 4 INVOKEVIRTUAL +hello world +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 7 LDC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 9 ARETURN +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ └──────────────────[4] haidnor.jvm.test.demo.Demo5 | public static String method3(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ 4 ARETURN +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ └──────────────────[3] haidnor.jvm.test.demo.Demo5 | public static String method2(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ 4 ARETURN +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ └──────────────────[2] haidnor.jvm.test.demo.Demo5 | public static String method1(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 5 ASTORE_1 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 6 ALOAD_1 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 7 INVOKESTATIC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ ┌──────────────────[2] haidnor.jvm.test.demo.Demo5 | public static String method1(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ 0 ALOAD_0 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ 1 INVOKESTATIC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ ┌──────────────────[3] haidnor.jvm.test.demo.Demo5 | public static String method2(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ 0 ALOAD_0 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ 1 INVOKESTATIC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ ┌──────────────────[4] haidnor.jvm.test.demo.Demo5 | public static String method3(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 0 GETSTATIC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 3 ALOAD_0 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 4 INVOKEVIRTUAL +你好 世界 +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 7 LDC +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ │ 9 ARETURN +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ └──────────────────[4] haidnor.jvm.test.demo.Demo5 | public static String method3(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ │ 4 ARETURN +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ └──────────────────[3] haidnor.jvm.test.demo.Demo5 | public static String method2(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ │ 4 ARETURN +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ └──────────────────[2] haidnor.jvm.test.demo.Demo5 | public static String method1(String s) +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 10 POP +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - │ 11 RETURN +[main] DEBUG haidnor.jvm.core.JavaExecutionEngine - └──────────────────[1] haidnor.jvm.test.demo.Demo5 | public static void main(String[] args) + +``` ### 配置 rt.jar 路径 修改 `haidnorJVM.properties` 文件中的内容。配置 rt.jar 的绝对路径,例如`rt.jar=D:/Program Files/Java/jdk1.8.0_361/jre/lib/rt.jar` diff --git a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java index 1627523..dad918f 100644 --- a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java +++ b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java @@ -90,10 +90,9 @@ public class JavaExecutionEngine { while (codeStream.available() > 0) { Instruction instruction = InstructionFactory.creatInstruction(codeStream); instructionMap.put(instruction.index(), instruction); - log.debug("{}│> {}", blank, instruction); + // log.debug("{}│> {}", blank, instruction); // debug 输出解析字节码指令的内容 } - - log.debug("{}├ - - - - - - - - -", blank); + // log.debug("{}├ - - - - - - - - -", blank); // 执行方法中的字节码指令 // 提示: 变量 pc 相当于程序计数器, 记录当前执行到的字节码指令的"行号"