diff --git a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java index 92d4987..4d36eff 100644 --- a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java +++ b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java @@ -27,7 +27,6 @@ public class JavaExecutionEngine { public static void callMethod(Frame lastFrame, KlassMethod klassMethod) { JvmThread jvmThread = JvmThreadHolder.get(); Frame newFrame = new Frame(jvmThread, klassMethod); - // 如果有上一个栈帧, 代表需要传参 if (lastFrame != null) { Method method = klassMethod.javaMethod; diff --git a/src/main/java/haidnor/jvm/rtda/heap/Klass.java b/src/main/java/haidnor/jvm/rtda/heap/Klass.java index 5e59c74..4f798f9 100644 --- a/src/main/java/haidnor/jvm/rtda/heap/Klass.java +++ b/src/main/java/haidnor/jvm/rtda/heap/Klass.java @@ -44,6 +44,14 @@ public class Klass { */ private Map staticFieldMap = new HashMap<>(); + /** + * 加载类元数据并将类放入元空间 + *

+ * 执行顺序如下 + * 1.优先加载父类 + * 2.为类元数据创建静态字段(此时并没有给静态字符赋值) + * 3.执行 clinit 方法(静态方法), 为静态字段赋值,或执行自定义逻辑. + */ @SneakyThrows public Klass(ClassLoader classLoader, JavaClass javaClass) { this.javaClass = javaClass; @@ -51,6 +59,14 @@ public class Klass { this.className = javaClass.getClassName(); this.superClassName = javaClass.getSuperclassName(); + // loader super class + JavaClass superJavaClass = javaClass.getSuperClass(); + if (superJavaClass != null) { + this.superKlass = new Klass(classLoader, superJavaClass); + } + + Metaspace.registerJavaClass(this); + // init staticFieldMap for (Field field : javaClass.getFields()) { if (field.isStatic()) { @@ -58,8 +74,6 @@ public class Klass { } } - Metaspace.registerJavaClass(this); - // execute method if (!javaClass.getClassName().startsWith("java.")) { for (Method method : javaClass.getMethods()) { @@ -70,12 +84,6 @@ public class Klass { } } } - - // loader super class - JavaClass superJavaClass = javaClass.getSuperClass(); - if (superJavaClass != null) { - this.superKlass = new Klass(classLoader, superJavaClass); - } } public KlassField getStaticField(String filedName) { diff --git a/src/test/java/haidnor/jvm/test/clazz/Human.java b/src/test/java/haidnor/jvm/test/clazz/Human.java index f2473d8..93e90cd 100644 --- a/src/test/java/haidnor/jvm/test/clazz/Human.java +++ b/src/test/java/haidnor/jvm/test/clazz/Human.java @@ -2,7 +2,14 @@ package haidnor.jvm.test.clazz; public class Human { + public static final String HUMAN_NAME = "123"; + + static { + System.out.println("Human 类被加载了"); + } + public void eat() { + Object o = new Object(); System.out.println("人类吃饭"); } diff --git a/src/test/java/haidnor/jvm/test/clazz/Student.java b/src/test/java/haidnor/jvm/test/clazz/Student.java index 3cced91..f59dbd5 100644 --- a/src/test/java/haidnor/jvm/test/clazz/Student.java +++ b/src/test/java/haidnor/jvm/test/clazz/Student.java @@ -6,6 +6,11 @@ public class Student extends Human { public static String school = "Hello World!"; + static { + System.out.println(HUMAN_NAME); + System.out.println("student 类被加载了"); + } + public void method1() { System.out.println("method1"); method2();