diff --git a/src/main/java/haidnor/jvm/bcel/classfile/JavaClass.java b/src/main/java/haidnor/jvm/bcel/classfile/JavaClass.java index 0150703..9c61ac4 100644 --- a/src/main/java/haidnor/jvm/bcel/classfile/JavaClass.java +++ b/src/main/java/haidnor/jvm/bcel/classfile/JavaClass.java @@ -210,6 +210,11 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl staticJavaFieldMap.put(field.getName(), field); } } + + JavaMethod[] javaMethods = getMethods(); + for (JavaMethod javaMethod : javaMethods) { + javaMethod.setJavaClass(this); + } } /* diff --git a/src/main/java/haidnor/jvm/bcel/classfile/JavaMethod.java b/src/main/java/haidnor/jvm/bcel/classfile/JavaMethod.java index 4f2e62d..08de218 100644 --- a/src/main/java/haidnor/jvm/bcel/classfile/JavaMethod.java +++ b/src/main/java/haidnor/jvm/bcel/classfile/JavaMethod.java @@ -18,6 +18,8 @@ package haidnor.jvm.bcel.classfile; import haidnor.jvm.bcel.generic.Type; import haidnor.jvm.bcel.util.BCELComparator; +import lombok.Getter; +import lombok.Setter; import java.io.DataInput; import java.io.IOException; @@ -57,6 +59,10 @@ public class JavaMethod extends FieldOrMethod { // annotations defined on the parameters of a method private ParameterAnnotationEntry[] parameterAnnotationEntries; + @Getter + @Setter + private JavaClass javaClass; + /** * Empty constructor, all attributes have to be defined via 'setXXX' methods. Use at your own risk. */ diff --git a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java index c1d1979..f708fe1 100644 --- a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java +++ b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java @@ -28,7 +28,7 @@ public class JavaExecutionEngine { */ public static void callMainMethod(JavaClass javaClass) { JavaMethod mainMethod = javaClass.getMainMethod(); - callMethod(null, javaClass, mainMethod); + callMethod(null, mainMethod); } /** @@ -37,10 +37,10 @@ public class JavaExecutionEngine { * @param lastFrame 方法调用者的栈帧 * @param javaMethod 方法元信息 */ - public static void callMethod(Frame lastFrame, JavaClass javaClass, JavaMethod javaMethod) { + public static void callMethod(Frame lastFrame, JavaMethod javaMethod) { JVMThread jvmThread = JVMThreadHolder.get(); // 调用方法时会创建新的栈帧 - Frame newFrame = new Frame(jvmThread, javaClass, javaMethod); + Frame newFrame = new Frame(jvmThread, javaMethod); // 如果线程栈内存在栈帧, 代表可能需要方法调用传参 if (lastFrame != null) { diff --git a/src/main/java/haidnor/jvm/runtime/Frame.java b/src/main/java/haidnor/jvm/runtime/Frame.java index b5075c0..c50a138 100644 --- a/src/main/java/haidnor/jvm/runtime/Frame.java +++ b/src/main/java/haidnor/jvm/runtime/Frame.java @@ -51,9 +51,9 @@ public class Frame { */ private final Slot[] slots; - public Frame(JVMThread thread, JavaClass javaClass, JavaMethod javaMethod) { + public Frame(JVMThread thread, JavaMethod javaMethod) { this.jvmThread = thread; - this.javaClass = javaClass; + this.javaClass = javaMethod.getJavaClass(); this.javaMethod = javaMethod; this.code = javaMethod.getCode(); this.codeStream = new CodeStream(javaMethod.getCode());