update Klass() 优先加载父类

This commit is contained in:
wangxiang
2023-07-21 21:51:21 +08:00
parent 0e9b302b5a
commit 5f8d9567bc
4 changed files with 28 additions and 9 deletions

View File

@@ -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;

View File

@@ -44,6 +44,14 @@ public class Klass {
*/
private Map<String, KlassField> staticFieldMap = new HashMap<>();
/**
* 加载类元数据并将类放入元空间
* <p>
* 执行顺序如下
* 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 <clinit> 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) {

View File

@@ -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("人类吃饭");
}

View File

@@ -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();