diff --git a/src/main/java/haidnor/jvm/Main.java b/src/main/java/haidnor/jvm/Main.java index d338711..36fbc44 100644 --- a/src/main/java/haidnor/jvm/Main.java +++ b/src/main/java/haidnor/jvm/Main.java @@ -9,10 +9,10 @@ import org.apache.commons.cli.Options; import haidnor.jvm.classloader.ClassLoader; import haidnor.jvm.core.JavaExecutionEngine; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.heap.KlassMethod; -import haidnor.jvm.rtda.metaspace.Metaspace; -import haidnor.jvm.runtime.JvmThread; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.KlassMethod; +import haidnor.jvm.rtda.Metaspace; +import haidnor.jvm.runtime.JVMThread; import haidnor.jvm.util.JavaClassUtil; import haidnor.jvm.util.JvmThreadHolder; import lombok.SneakyThrows; @@ -53,11 +53,11 @@ public class Main { if (!entry.isDirectory() && entry.getName().endsWith(".class")) { String className = entry.getName().replace('/', '.').substring(0, entry.getName().length() - 6); if (className.equals(mainClass)) { - JvmThreadHolder.set(new JvmThread()); + JvmThreadHolder.set(new JVMThread()); Klass mainMeteKlass = bootClassLoader.loadClass(jarFile, entry); KlassMethod mainKlassMethod = JavaClassUtil.getMainMethod(mainMeteKlass); Metaspace.registerJavaClass(mainMeteKlass); - JavaExecutionEngine.callMainStaticMethod(mainKlassMethod); + JavaExecutionEngine.callMainMethod(mainKlassMethod); return; } } @@ -65,14 +65,14 @@ public class Main { } } if (cmd.hasOption("class")) { - JvmThreadHolder.set(new JvmThread()); + JvmThreadHolder.set(new JVMThread()); String path = cmd.getOptionValue("class"); ClassLoader bootClassLoader = new ClassLoader("ApplicationClassLoader"); Klass mainMeteKlass = bootClassLoader.loadClassWithAbsolutePath(path); KlassMethod mainKlassMethod = JavaClassUtil.getMainMethod(mainMeteKlass); Metaspace.registerJavaClass(mainMeteKlass); - JavaExecutionEngine.callMainStaticMethod(mainKlassMethod); + JavaExecutionEngine.callMainMethod(mainKlassMethod); } } diff --git a/src/main/java/haidnor/jvm/classloader/ClassLoader.java b/src/main/java/haidnor/jvm/classloader/ClassLoader.java index 46cc832..8517586 100644 --- a/src/main/java/haidnor/jvm/classloader/ClassLoader.java +++ b/src/main/java/haidnor/jvm/classloader/ClassLoader.java @@ -1,6 +1,6 @@ package haidnor.jvm.classloader; -import haidnor.jvm.rtda.heap.Klass; +import haidnor.jvm.rtda.Klass; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; diff --git a/src/main/java/haidnor/jvm/core/Interpreter.java b/src/main/java/haidnor/jvm/core/Interpreter.java deleted file mode 100644 index 4f56f94..0000000 --- a/src/main/java/haidnor/jvm/core/Interpreter.java +++ /dev/null @@ -1,61 +0,0 @@ -package haidnor.jvm.core; - -import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.instruction.InstructionFactory; -import haidnor.jvm.instruction.control.RETURN; -import haidnor.jvm.runtime.Frame; -import haidnor.jvm.util.CodeStream; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * 字节码执行解释器 - * - * @author wang xiang - */ -@Slf4j -public class Interpreter { - - @SneakyThrows - public static void executeFrame(Frame frame) { - int stackSize = frame.getJvmThread().stackSize(); - - StringBuilder blank = new StringBuilder(); - blank.append(" ".repeat(stackSize - 1)); - int index = 0; - for (int i = 0; i < stackSize - 1; i++) { - blank.replace(index, index + 1, "│"); - index += 20; - } - - log.debug("{}┌──────────────────[{}] {} | {}", blank, stackSize, frame.klass.getClassName(), frame.getMethod()); - - // 解析方法中的字节码指令 - Map instructionMap = new HashMap<>(); - CodeStream codeStream = frame.getCodeStream(); - while (codeStream.available() > 0) { - Instruction instruction = InstructionFactory.creatInstruction(codeStream); - log.debug("{}│> {}", blank, instruction); - instructionMap.put(instruction.index(), instruction); - } - - log.debug("{}├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌", blank); - - // 执行方法中的字节码指令 tip:(int i, 相当于程序计数器, 记录当前执行到的字节码指令的”行号“) - for (int i = 0; i < frame.getCodeLength(); ) { - Instruction instruction = instructionMap.get(i); - log.debug("{}│ {}", blank, instruction); - instruction.execute(frame); - if (instruction instanceof RETURN) { - break; - } - i += instruction.offSet(); - } - - log.debug("{}└──────────────────[{}] {} | {}", blank, stackSize, frame.klass.getClassName(), frame.getMethod()); - } - -} \ No newline at end of file diff --git a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java index 4d36eff..751af68 100644 --- a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java +++ b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java @@ -1,32 +1,41 @@ package haidnor.jvm.core; -import haidnor.jvm.rtda.heap.KlassMethod; +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.instruction.InstructionFactory; +import haidnor.jvm.instruction.control.RETURN; +import haidnor.jvm.rtda.KlassMethod; import haidnor.jvm.runtime.Frame; -import haidnor.jvm.runtime.JvmThread; +import haidnor.jvm.runtime.JVMThread; import haidnor.jvm.runtime.StackValue; +import haidnor.jvm.util.CodeStream; import haidnor.jvm.util.JvmThreadHolder; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.bcel.classfile.LocalVariable; import org.apache.bcel.classfile.LocalVariableTable; import org.apache.bcel.classfile.Method; import org.apache.bcel.classfile.Utility; +import java.util.HashMap; +import java.util.Map; + +/** + * JVM 执行引擎 + * + * @author wang xiang + */ @Slf4j public class JavaExecutionEngine { - public static void callMainStaticMethod(KlassMethod klassMethod) { - JvmThread jvmThread = JvmThreadHolder.get(); - // 每个栈帧中包含一个指向运行时常量池中该栈帧所属的方法的引用。包含这个引用的目的就是为了支持当前方法实现动态链接 - // 有了这个引用,执行引擎就可以找到指定的方法,加载字节码指令 - Frame frame = new Frame(jvmThread, klassMethod); - jvmThread.push(frame); - Interpreter.executeFrame(frame); + public static void callMainMethod(KlassMethod klassMethod) { + callMethod(null, klassMethod); } public static void callMethod(Frame lastFrame, KlassMethod klassMethod) { - JvmThread jvmThread = JvmThreadHolder.get(); + JVMThread jvmThread = JvmThreadHolder.get(); Frame newFrame = new Frame(jvmThread, klassMethod); + // 如果有上一个栈帧, 代表需要传参 if (lastFrame != null) { Method method = klassMethod.javaMethod; @@ -53,7 +62,46 @@ public class JavaExecutionEngine { } jvmThread.push(newFrame); - Interpreter.executeFrame(newFrame); + executeFrame(newFrame); + } + + @SneakyThrows + public static void executeFrame(Frame frame) { + int stackSize = frame.getJvmThread().stackSize(); + + StringBuilder blank = new StringBuilder(); + blank.append(" ".repeat(stackSize - 1)); + int index = 0; + for (int i = 0; i < stackSize - 1; i++) { + blank.replace(index, index + 1, "│"); + index += 20; + } + + log.debug("{}┌──────────────────[{}] {} | {}", blank, stackSize, frame.klass.getClassName(), frame.getMethod()); + + // 解析方法中的字节码指令 + Map instructionMap = new HashMap<>(); + CodeStream codeStream = frame.getCodeStream(); + while (codeStream.available() > 0) { + Instruction instruction = InstructionFactory.creatInstruction(codeStream); + log.debug("{}│> {}", blank, instruction); + instructionMap.put(instruction.index(), instruction); + } + + log.debug("{}├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌", blank); + + // 执行方法中的字节码指令 tip:(int i, 相当于程序计数器, 记录当前执行到的字节码指令的”行号“) + for (int i = 0; i < frame.getCodeLength(); ) { + Instruction instruction = instructionMap.get(i); + log.debug("{}│ {}", blank, instruction); + instruction.execute(frame); + if (instruction instanceof RETURN) { + break; + } + i += instruction.offSet(); + } + + log.debug("{}└──────────────────[{}] {} | {}", blank, stackSize, frame.klass.getClassName(), frame.getMethod()); } diff --git a/src/main/java/haidnor/jvm/instruction/InstructionFactory.java b/src/main/java/haidnor/jvm/instruction/InstructionFactory.java index 5534301..7e2958a 100644 --- a/src/main/java/haidnor/jvm/instruction/InstructionFactory.java +++ b/src/main/java/haidnor/jvm/instruction/InstructionFactory.java @@ -16,6 +16,9 @@ import haidnor.jvm.instruction.stores.*; import haidnor.jvm.util.CodeStream; import org.apache.bcel.Const; +/** + * @author wang xiang + */ public abstract class InstructionFactory { public static Instruction creatInstruction(CodeStream codeStream) { diff --git a/src/main/java/haidnor/jvm/instruction/loads/AALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/AALOAD.java index acc30b6..38b95ee 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/AALOAD.java +++ b/src/main/java/haidnor/jvm/instruction/loads/AALOAD.java @@ -1,8 +1,8 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; -import haidnor.jvm.rtda.heap.InstanceArray; +import haidnor.jvm.rtda.Instance; +import haidnor.jvm.rtda.InstanceArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/ALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/ALOAD.java index 2819ae4..6dfa3d7 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/ALOAD.java +++ b/src/main/java/haidnor/jvm/instruction/loads/ALOAD.java @@ -1,7 +1,6 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/ALOAD_0.java b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_0.java index 5f83857..4c22869 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/ALOAD_0.java +++ b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_0.java @@ -1,7 +1,6 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/ALOAD_1.java b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_1.java index 0d7f851..7ba5cbc 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/ALOAD_1.java +++ b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_1.java @@ -1,7 +1,6 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/BALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/BALOAD.java index f069c41..5e9bbf4 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/BALOAD.java +++ b/src/main/java/haidnor/jvm/instruction/loads/BALOAD.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/CALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/CALOAD.java index edc9cd7..3ccc6a1 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/CALOAD.java +++ b/src/main/java/haidnor/jvm/instruction/loads/CALOAD.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/DALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/DALOAD.java index 59ef521..5db952e 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/DALOAD.java +++ b/src/main/java/haidnor/jvm/instruction/loads/DALOAD.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/FALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/FALOAD.java index 66be156..f6e21d1 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/FALOAD.java +++ b/src/main/java/haidnor/jvm/instruction/loads/FALOAD.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/IALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/IALOAD.java index 1a58fe7..4abd5d2 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/IALOAD.java +++ b/src/main/java/haidnor/jvm/instruction/loads/IALOAD.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/LALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/LALOAD.java index 9b676a4..ade4a89 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/LALOAD.java +++ b/src/main/java/haidnor/jvm/instruction/loads/LALOAD.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/loads/SALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/SALOAD.java index 3428db7..a51a2fa 100644 --- a/src/main/java/haidnor/jvm/instruction/loads/SALOAD.java +++ b/src/main/java/haidnor/jvm/instruction/loads/SALOAD.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.loads; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/references/ANEWARRAY.java b/src/main/java/haidnor/jvm/instruction/references/ANEWARRAY.java index 5a2a27a..30f694f 100644 --- a/src/main/java/haidnor/jvm/instruction/references/ANEWARRAY.java +++ b/src/main/java/haidnor/jvm/instruction/references/ANEWARRAY.java @@ -1,10 +1,10 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; -import haidnor.jvm.rtda.heap.InstanceArray; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.metaspace.Metaspace; +import haidnor.jvm.rtda.Instance; +import haidnor.jvm.rtda.InstanceArray; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.Metaspace; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/references/ARRAYLENGTH.java b/src/main/java/haidnor/jvm/instruction/references/ARRAYLENGTH.java index 4d245df..0b5ca55 100644 --- a/src/main/java/haidnor/jvm/instruction/references/ARRAYLENGTH.java +++ b/src/main/java/haidnor/jvm/instruction/references/ARRAYLENGTH.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.ArrayInstance; +import haidnor.jvm.rtda.ArrayInstance; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; import lombok.SneakyThrows; diff --git a/src/main/java/haidnor/jvm/instruction/references/GETFIELD.java b/src/main/java/haidnor/jvm/instruction/references/GETFIELD.java index edd13d7..ca4bfc5 100644 --- a/src/main/java/haidnor/jvm/instruction/references/GETFIELD.java +++ b/src/main/java/haidnor/jvm/instruction/references/GETFIELD.java @@ -1,8 +1,8 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; -import haidnor.jvm.rtda.heap.KlassField; +import haidnor.jvm.rtda.Instance; +import haidnor.jvm.rtda.KlassField; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; import haidnor.jvm.util.ConstantPoolUtil; diff --git a/src/main/java/haidnor/jvm/instruction/references/GETSTATIC.java b/src/main/java/haidnor/jvm/instruction/references/GETSTATIC.java index 46900c5..6cd3617 100644 --- a/src/main/java/haidnor/jvm/instruction/references/GETSTATIC.java +++ b/src/main/java/haidnor/jvm/instruction/references/GETSTATIC.java @@ -1,9 +1,9 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.heap.KlassField; -import haidnor.jvm.rtda.metaspace.Metaspace; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.KlassField; +import haidnor.jvm.rtda.Metaspace; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/references/INSTANCEOF.java b/src/main/java/haidnor/jvm/instruction/references/INSTANCEOF.java index 3ed1376..1ecfdc3 100644 --- a/src/main/java/haidnor/jvm/instruction/references/INSTANCEOF.java +++ b/src/main/java/haidnor/jvm/instruction/references/INSTANCEOF.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; +import haidnor.jvm.rtda.Instance; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/references/INVOKESPECIAL.java b/src/main/java/haidnor/jvm/instruction/references/INVOKESPECIAL.java index 0c7b8c3..5ecf266 100644 --- a/src/main/java/haidnor/jvm/instruction/references/INVOKESPECIAL.java +++ b/src/main/java/haidnor/jvm/instruction/references/INVOKESPECIAL.java @@ -3,9 +3,9 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.classloader.ClassLoader; import haidnor.jvm.core.JavaExecutionEngine; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.heap.KlassMethod; -import haidnor.jvm.rtda.metaspace.Metaspace; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.KlassMethod; +import haidnor.jvm.rtda.Metaspace; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/references/INVOKESTATIC.java b/src/main/java/haidnor/jvm/instruction/references/INVOKESTATIC.java index b7a74c3..285ee12 100644 --- a/src/main/java/haidnor/jvm/instruction/references/INVOKESTATIC.java +++ b/src/main/java/haidnor/jvm/instruction/references/INVOKESTATIC.java @@ -2,9 +2,9 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.core.JavaExecutionEngine; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.heap.KlassMethod; -import haidnor.jvm.rtda.metaspace.Metaspace; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.KlassMethod; +import haidnor.jvm.rtda.Metaspace; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/references/INVOKEVIRTUAL.java b/src/main/java/haidnor/jvm/instruction/references/INVOKEVIRTUAL.java index 281d263..d1a5e18 100644 --- a/src/main/java/haidnor/jvm/instruction/references/INVOKEVIRTUAL.java +++ b/src/main/java/haidnor/jvm/instruction/references/INVOKEVIRTUAL.java @@ -3,9 +3,9 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.classloader.ClassLoader; import haidnor.jvm.core.JavaExecutionEngine; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.heap.KlassMethod; -import haidnor.jvm.rtda.metaspace.Metaspace; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.KlassMethod; +import haidnor.jvm.rtda.Metaspace; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/references/NEW.java b/src/main/java/haidnor/jvm/instruction/references/NEW.java index 59a7c6f..67c0d05 100644 --- a/src/main/java/haidnor/jvm/instruction/references/NEW.java +++ b/src/main/java/haidnor/jvm/instruction/references/NEW.java @@ -1,9 +1,9 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.metaspace.Metaspace; +import haidnor.jvm.rtda.Instance; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.Metaspace; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/references/NEWARRAY.java b/src/main/java/haidnor/jvm/instruction/references/NEWARRAY.java index 5c0a3e8..414ea28 100644 --- a/src/main/java/haidnor/jvm/instruction/references/NEWARRAY.java +++ b/src/main/java/haidnor/jvm/instruction/references/NEWARRAY.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; import lombok.SneakyThrows; diff --git a/src/main/java/haidnor/jvm/instruction/references/PUTFIELD.java b/src/main/java/haidnor/jvm/instruction/references/PUTFIELD.java index 9866e36..5a7f7d7 100644 --- a/src/main/java/haidnor/jvm/instruction/references/PUTFIELD.java +++ b/src/main/java/haidnor/jvm/instruction/references/PUTFIELD.java @@ -1,8 +1,8 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; -import haidnor.jvm.rtda.heap.KlassField; +import haidnor.jvm.rtda.Instance; +import haidnor.jvm.rtda.KlassField; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.StackValue; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/references/PUTSTATIC.java b/src/main/java/haidnor/jvm/instruction/references/PUTSTATIC.java index 5243aa9..ebbffcc 100644 --- a/src/main/java/haidnor/jvm/instruction/references/PUTSTATIC.java +++ b/src/main/java/haidnor/jvm/instruction/references/PUTSTATIC.java @@ -1,9 +1,9 @@ package haidnor.jvm.instruction.references; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.heap.KlassField; -import haidnor.jvm.rtda.metaspace.Metaspace; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.KlassField; +import haidnor.jvm.rtda.Metaspace; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; import haidnor.jvm.util.ConstantPoolUtil; diff --git a/src/main/java/haidnor/jvm/instruction/stack/SWAP.java b/src/main/java/haidnor/jvm/instruction/stack/SWAP.java index 3cd35d1..ccf515e 100644 --- a/src/main/java/haidnor/jvm/instruction/stack/SWAP.java +++ b/src/main/java/haidnor/jvm/instruction/stack/SWAP.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.stack; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; +import haidnor.jvm.rtda.Instance; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; import lombok.SneakyThrows; diff --git a/src/main/java/haidnor/jvm/instruction/stores/AASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/AASTORE.java index bc17d68..1a60aff 100644 --- a/src/main/java/haidnor/jvm/instruction/stores/AASTORE.java +++ b/src/main/java/haidnor/jvm/instruction/stores/AASTORE.java @@ -1,8 +1,8 @@ package haidnor.jvm.instruction.stores; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.Instance; -import haidnor.jvm.rtda.heap.InstanceArray; +import haidnor.jvm.rtda.Instance; +import haidnor.jvm.rtda.InstanceArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/stores/BASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/BASTORE.java index d92693a..5bf333d 100644 --- a/src/main/java/haidnor/jvm/instruction/stores/BASTORE.java +++ b/src/main/java/haidnor/jvm/instruction/stores/BASTORE.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.stores; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/stores/CASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/CASTORE.java index 5677d74..c59dcdc 100644 --- a/src/main/java/haidnor/jvm/instruction/stores/CASTORE.java +++ b/src/main/java/haidnor/jvm/instruction/stores/CASTORE.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.stores; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/stores/DASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/DASTORE.java index ab3dac1..a4359b0 100644 --- a/src/main/java/haidnor/jvm/instruction/stores/DASTORE.java +++ b/src/main/java/haidnor/jvm/instruction/stores/DASTORE.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.stores; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/stores/FASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/FASTORE.java index d172a64..52ee484 100644 --- a/src/main/java/haidnor/jvm/instruction/stores/FASTORE.java +++ b/src/main/java/haidnor/jvm/instruction/stores/FASTORE.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.stores; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/stores/IASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/IASTORE.java index 62a5804..ce632e4 100644 --- a/src/main/java/haidnor/jvm/instruction/stores/IASTORE.java +++ b/src/main/java/haidnor/jvm/instruction/stores/IASTORE.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.stores; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/stores/LASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/LASTORE.java index 273fa56..f8b8a7c 100644 --- a/src/main/java/haidnor/jvm/instruction/stores/LASTORE.java +++ b/src/main/java/haidnor/jvm/instruction/stores/LASTORE.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.stores; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/instruction/stores/SASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/SASTORE.java index 00b8bbd..4d4ebf6 100644 --- a/src/main/java/haidnor/jvm/instruction/stores/SASTORE.java +++ b/src/main/java/haidnor/jvm/instruction/stores/SASTORE.java @@ -1,7 +1,7 @@ package haidnor.jvm.instruction.stores; import haidnor.jvm.instruction.Instruction; -import haidnor.jvm.rtda.heap.BasicTypeArray; +import haidnor.jvm.rtda.BasicTypeArray; import haidnor.jvm.runtime.Frame; import haidnor.jvm.util.CodeStream; diff --git a/src/main/java/haidnor/jvm/rtda/heap/ArrayInstance.java b/src/main/java/haidnor/jvm/rtda/ArrayInstance.java similarity index 87% rename from src/main/java/haidnor/jvm/rtda/heap/ArrayInstance.java rename to src/main/java/haidnor/jvm/rtda/ArrayInstance.java index accbc7a..c0262e9 100644 --- a/src/main/java/haidnor/jvm/rtda/heap/ArrayInstance.java +++ b/src/main/java/haidnor/jvm/rtda/ArrayInstance.java @@ -1,4 +1,4 @@ -package haidnor.jvm.rtda.heap; +package haidnor.jvm.rtda; /** * @author wang xiang diff --git a/src/main/java/haidnor/jvm/rtda/heap/BasicTypeArray.java b/src/main/java/haidnor/jvm/rtda/BasicTypeArray.java similarity index 98% rename from src/main/java/haidnor/jvm/rtda/heap/BasicTypeArray.java rename to src/main/java/haidnor/jvm/rtda/BasicTypeArray.java index defc19c..4f90986 100644 --- a/src/main/java/haidnor/jvm/rtda/heap/BasicTypeArray.java +++ b/src/main/java/haidnor/jvm/rtda/BasicTypeArray.java @@ -1,4 +1,4 @@ -package haidnor.jvm.rtda.heap; +package haidnor.jvm.rtda; /** * @author wang xiang diff --git a/src/main/java/haidnor/jvm/rtda/heap/Instance.java b/src/main/java/haidnor/jvm/rtda/Instance.java similarity index 98% rename from src/main/java/haidnor/jvm/rtda/heap/Instance.java rename to src/main/java/haidnor/jvm/rtda/Instance.java index 53c33e5..37b4e2d 100644 --- a/src/main/java/haidnor/jvm/rtda/heap/Instance.java +++ b/src/main/java/haidnor/jvm/rtda/Instance.java @@ -1,4 +1,4 @@ -package haidnor.jvm.rtda.heap; +package haidnor.jvm.rtda; import java.util.ArrayList; diff --git a/src/main/java/haidnor/jvm/rtda/heap/InstanceArray.java b/src/main/java/haidnor/jvm/rtda/InstanceArray.java similarity index 88% rename from src/main/java/haidnor/jvm/rtda/heap/InstanceArray.java rename to src/main/java/haidnor/jvm/rtda/InstanceArray.java index 3118ec2..64e1819 100644 --- a/src/main/java/haidnor/jvm/rtda/heap/InstanceArray.java +++ b/src/main/java/haidnor/jvm/rtda/InstanceArray.java @@ -1,4 +1,4 @@ -package haidnor.jvm.rtda.heap; +package haidnor.jvm.rtda; /** * @author wang xiang diff --git a/src/main/java/haidnor/jvm/rtda/heap/Klass.java b/src/main/java/haidnor/jvm/rtda/Klass.java similarity index 97% rename from src/main/java/haidnor/jvm/rtda/heap/Klass.java rename to src/main/java/haidnor/jvm/rtda/Klass.java index 4f798f9..ef9d8ec 100644 --- a/src/main/java/haidnor/jvm/rtda/heap/Klass.java +++ b/src/main/java/haidnor/jvm/rtda/Klass.java @@ -1,8 +1,7 @@ -package haidnor.jvm.rtda.heap; +package haidnor.jvm.rtda; import haidnor.jvm.classloader.ClassLoader; import haidnor.jvm.core.JavaExecutionEngine; -import haidnor.jvm.rtda.metaspace.Metaspace; import lombok.SneakyThrows; import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.JavaClass; diff --git a/src/main/java/haidnor/jvm/rtda/heap/KlassField.java b/src/main/java/haidnor/jvm/rtda/KlassField.java similarity index 96% rename from src/main/java/haidnor/jvm/rtda/heap/KlassField.java rename to src/main/java/haidnor/jvm/rtda/KlassField.java index 332e617..676fb37 100644 --- a/src/main/java/haidnor/jvm/rtda/heap/KlassField.java +++ b/src/main/java/haidnor/jvm/rtda/KlassField.java @@ -1,4 +1,4 @@ -package haidnor.jvm.rtda.heap; +package haidnor.jvm.rtda; import haidnor.jvm.runtime.StackValue; import org.apache.bcel.Const; diff --git a/src/main/java/haidnor/jvm/rtda/heap/KlassMethod.java b/src/main/java/haidnor/jvm/rtda/KlassMethod.java similarity index 91% rename from src/main/java/haidnor/jvm/rtda/heap/KlassMethod.java rename to src/main/java/haidnor/jvm/rtda/KlassMethod.java index 917703e..378ef44 100644 --- a/src/main/java/haidnor/jvm/rtda/heap/KlassMethod.java +++ b/src/main/java/haidnor/jvm/rtda/KlassMethod.java @@ -1,4 +1,4 @@ -package haidnor.jvm.rtda.heap; +package haidnor.jvm.rtda; import org.apache.bcel.classfile.Method; diff --git a/src/main/java/haidnor/jvm/rtda/metaspace/Metaspace.java b/src/main/java/haidnor/jvm/rtda/Metaspace.java similarity index 90% rename from src/main/java/haidnor/jvm/rtda/metaspace/Metaspace.java rename to src/main/java/haidnor/jvm/rtda/Metaspace.java index 2a58ce9..208c8c5 100644 --- a/src/main/java/haidnor/jvm/rtda/metaspace/Metaspace.java +++ b/src/main/java/haidnor/jvm/rtda/Metaspace.java @@ -1,6 +1,4 @@ -package haidnor.jvm.rtda.metaspace; - -import haidnor.jvm.rtda.heap.Klass; +package haidnor.jvm.rtda; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/haidnor/jvm/rtda/UnionSlot.java b/src/main/java/haidnor/jvm/rtda/UnionSlot.java deleted file mode 100644 index adf9761..0000000 --- a/src/main/java/haidnor/jvm/rtda/UnionSlot.java +++ /dev/null @@ -1,103 +0,0 @@ -package haidnor.jvm.rtda; - -import haidnor.jvm.rtda.heap.Instance; -import haidnor.jvm.runtime.Slot; - -/** - * 用于字段的联合 Slot - */ -public class UnionSlot { - - private Slot high; - private Slot low; - - private UnionSlot(Slot high, Slot low) { - this.high = high; - this.low = low; - } - - // 初始化 - public static UnionSlot of(Slot high, Slot low) { - return new UnionSlot(high, low); - } - - public static UnionSlot of(Slot high) { - return new UnionSlot(high, null); - } - - public static UnionSlot of(Instance instance) { - return new UnionSlot(new Slot(instance), null); - } - - public static UnionSlot of(int val) { - return new UnionSlot(new Slot(val), null); - } - - public static UnionSlot of(float val) { - return of(Float.floatToIntBits(val)); - } - - public static UnionSlot of(long val) { - int high = (int) (val >> 32); //高32位 - int low = (int) (val & 0x000000ffffffffL); //低32位 - return new UnionSlot(new Slot(high), new Slot(low)); - } - - public static UnionSlot of(double val) { - return of(Double.doubleToLongBits(val)); - } - - // 存 - public void setRef(Instance val) { - high.ref = val; - } - - public void setInt(int val) { - high.num = val; - } - - public void setFloat(float val) { - setInt(Float.floatToIntBits(val)); - } - - public void setLong(long val) { - int highV = (int) (val >> 32); //高32位 - int lowV = (int) (val & 0x000000ffffffffL); //低32位 - high.num = highV; - low.num = lowV; - } - - public void setDouble(double val) { - setLong(Double.doubleToLongBits(val)); - } - - public void set(UnionSlot neo) { - this.high = neo.high; - this.low = neo.low; - } - - // 取 - public Object getRef() { - return high.ref; - } - - public int getInt() { - return high.num; - } - - public float getFloat() { - return Float.intBitsToFloat(getInt()); - } - - public long getLong() { - final int high = this.high.num; - final int low = this.low.num; - long l1 = (high & 0x000000ffffffffL) << 32; - long l2 = low & 0x00000000ffffffffL; - return l1 | l2; - } - - public double getDouble() { - return Double.longBitsToDouble(getLong()); - } -} \ No newline at end of file diff --git a/src/main/java/haidnor/jvm/rtda/heap/Heap.java b/src/main/java/haidnor/jvm/rtda/heap/Heap.java deleted file mode 100644 index ca3a372..0000000 --- a/src/main/java/haidnor/jvm/rtda/heap/Heap.java +++ /dev/null @@ -1,7 +0,0 @@ -package haidnor.jvm.rtda.heap; - -/** - * 堆空间 - */ -public class Heap { -} diff --git a/src/main/java/haidnor/jvm/runtime/Frame.java b/src/main/java/haidnor/jvm/runtime/Frame.java index 186af2c..5d3019e 100644 --- a/src/main/java/haidnor/jvm/runtime/Frame.java +++ b/src/main/java/haidnor/jvm/runtime/Frame.java @@ -1,14 +1,13 @@ package haidnor.jvm.runtime; -import haidnor.jvm.rtda.heap.Instance; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.heap.KlassMethod; +import haidnor.jvm.rtda.Instance; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.KlassMethod; import haidnor.jvm.util.CodeStream; import haidnor.jvm.util.ConstantPoolUtil; import org.apache.bcel.Const; import org.apache.bcel.classfile.Code; import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.LocalVariableTable; import java.util.Stack; @@ -21,7 +20,7 @@ public class Frame { /** * 当前栈帧所处于的 JVM 线程 */ - private final JvmThread jvmThread; + private final JVMThread jvmThread; /** * 栈帧所属的方法 @@ -33,6 +32,10 @@ public class Frame { private final KlassMethod klassMethod; + /** + * 每个栈帧中包含一个指向运行时常量池中该栈帧所属的方法的引用。包含这个引用的目的就是为了支持当前方法实现动态链接 + * 有了这个引用,执行引擎就可以找到指定的方法,加载字节码指令 + */ public final Klass klass; /** @@ -51,17 +54,12 @@ public class Frame { */ private final Stack operandStack = new Stack<>(); - /** - * 局部变量表 - */ - private final LocalVariableTable localVariableTable; - /** * 槽位 */ private final Slot[] slots; - public Frame(JvmThread jvmThread, KlassMethod klassMethod) { + public Frame(JVMThread jvmThread, KlassMethod klassMethod) { this.jvmThread = jvmThread; this.klass = klassMethod.aKlass; this.klassMethod = klassMethod; @@ -70,11 +68,10 @@ public class Frame { this.constantPool = method.getConstantPool(); this.constantPoolUtil = new ConstantPoolUtil(constantPool); this.codeStream = new CodeStream(method.getCode()); - this.localVariableTable = code.getLocalVariableTable(); this.slots = new Slot[code.getMaxLocals()]; } - public JvmThread getJvmThread() { + public JVMThread getJvmThread() { return jvmThread; } diff --git a/src/main/java/haidnor/jvm/runtime/JvmThread.java b/src/main/java/haidnor/jvm/runtime/JVMThread.java similarity index 92% rename from src/main/java/haidnor/jvm/runtime/JvmThread.java rename to src/main/java/haidnor/jvm/runtime/JVMThread.java index 4ce1942..9b50eac 100644 --- a/src/main/java/haidnor/jvm/runtime/JvmThread.java +++ b/src/main/java/haidnor/jvm/runtime/JVMThread.java @@ -7,7 +7,7 @@ import java.util.Stack; * * @author wang xiang */ -public class JvmThread extends Thread { +public class JVMThread extends Thread { /** * JVM 线程栈 diff --git a/src/main/java/haidnor/jvm/util/JavaClassUtil.java b/src/main/java/haidnor/jvm/util/JavaClassUtil.java index 23193b8..2a09354 100644 --- a/src/main/java/haidnor/jvm/util/JavaClassUtil.java +++ b/src/main/java/haidnor/jvm/util/JavaClassUtil.java @@ -1,7 +1,7 @@ package haidnor.jvm.util; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.heap.KlassMethod; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.KlassMethod; import org.apache.bcel.classfile.JavaClass; /** diff --git a/src/main/java/haidnor/jvm/util/JvmThreadHolder.java b/src/main/java/haidnor/jvm/util/JvmThreadHolder.java index dd7e2e9..0b9350a 100644 --- a/src/main/java/haidnor/jvm/util/JvmThreadHolder.java +++ b/src/main/java/haidnor/jvm/util/JvmThreadHolder.java @@ -1,19 +1,19 @@ package haidnor.jvm.util; -import haidnor.jvm.runtime.JvmThread; +import haidnor.jvm.runtime.JVMThread; /** * @author wang xiang */ public abstract class JvmThreadHolder { - private static final ThreadLocal holder = new ThreadLocal<>(); + private static final ThreadLocal holder = new ThreadLocal<>(); - public static void set(JvmThread thread) { + public static void set(JVMThread thread) { holder.set(thread); } - public static JvmThread get() { + public static JVMThread get() { return holder.get(); } diff --git a/src/test/java/haidnor/jvm/test/TestJVM.java b/src/test/java/haidnor/jvm/test/TestJVM.java index c1256a7..dc8b5f3 100644 --- a/src/test/java/haidnor/jvm/test/TestJVM.java +++ b/src/test/java/haidnor/jvm/test/TestJVM.java @@ -2,10 +2,10 @@ package haidnor.jvm.test; import haidnor.jvm.classloader.ClassLoader; import haidnor.jvm.core.JavaExecutionEngine; -import haidnor.jvm.rtda.heap.Klass; -import haidnor.jvm.rtda.heap.KlassMethod; -import haidnor.jvm.rtda.metaspace.Metaspace; -import haidnor.jvm.runtime.JvmThread; +import haidnor.jvm.rtda.Klass; +import haidnor.jvm.rtda.KlassMethod; +import haidnor.jvm.rtda.Metaspace; +import haidnor.jvm.runtime.JVMThread; import haidnor.jvm.test.demo.*; import haidnor.jvm.test.instruction.Array; import haidnor.jvm.test.instruction.DO_WHILE; @@ -28,13 +28,13 @@ public class TestJVM { @SneakyThrows public static void runMainClass(java.lang.Class mainClass) { - JvmThreadHolder.set(new JvmThread()); + JvmThreadHolder.set(new JVMThread()); ClassLoader bootClassLoader = new ClassLoader("ApplicationClassLoader"); Klass mainMeteKlass = bootClassLoader.loadClass(mainClass.getName().replace('.', '/')); KlassMethod mainKlassMethod = JavaClassUtil.getMainMethod(mainMeteKlass); Metaspace.registerJavaClass(mainMeteKlass); - JavaExecutionEngine.callMainStaticMethod(mainKlassMethod); + JavaExecutionEngine.callMainMethod(mainKlassMethod); } /** @@ -118,7 +118,7 @@ public class TestJVM { public void test_jar() throws Exception { String jarFilePath = "D:/project_java/JvmDemo/target/JvmDemo-1.0-SNAPSHOT.jar"; - JvmThreadHolder.set(new JvmThread()); + JvmThreadHolder.set(new JVMThread()); try (JarFile jarFile = new JarFile(jarFilePath)) { ClassLoader bootClassLoader = new ClassLoader(jarFile, "ApplicationClassLoader"); @@ -135,7 +135,7 @@ public class TestJVM { Klass mainMeteKlass = bootClassLoader.loadClass(jarFile, entry); KlassMethod mainKlassMethod = JavaClassUtil.getMainMethod(mainMeteKlass); Metaspace.registerJavaClass(mainMeteKlass); - JavaExecutionEngine.callMainStaticMethod(mainKlassMethod); + JavaExecutionEngine.callMainMethod(mainKlassMethod); break; } }