mirror of
https://github.com/FranzHaidnor/haidnorJVM.git
synced 2026-03-13 21:43:42 +08:00
update Klass() 优先加载父类
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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("人类吃饭");
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user