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) {
|
public static void callMethod(Frame lastFrame, KlassMethod klassMethod) {
|
||||||
JvmThread jvmThread = JvmThreadHolder.get();
|
JvmThread jvmThread = JvmThreadHolder.get();
|
||||||
Frame newFrame = new Frame(jvmThread, klassMethod);
|
Frame newFrame = new Frame(jvmThread, klassMethod);
|
||||||
|
|
||||||
// 如果有上一个栈帧, 代表需要传参
|
// 如果有上一个栈帧, 代表需要传参
|
||||||
if (lastFrame != null) {
|
if (lastFrame != null) {
|
||||||
Method method = klassMethod.javaMethod;
|
Method method = klassMethod.javaMethod;
|
||||||
|
|||||||
@@ -44,6 +44,14 @@ public class Klass {
|
|||||||
*/
|
*/
|
||||||
private Map<String, KlassField> staticFieldMap = new HashMap<>();
|
private Map<String, KlassField> staticFieldMap = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载类元数据并将类放入元空间
|
||||||
|
* <p>
|
||||||
|
* 执行顺序如下
|
||||||
|
* 1.优先加载父类
|
||||||
|
* 2.为类元数据创建静态字段(此时并没有给静态字符赋值)
|
||||||
|
* 3.执行 clinit 方法(静态方法), 为静态字段赋值,或执行自定义逻辑.
|
||||||
|
*/
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public Klass(ClassLoader classLoader, JavaClass javaClass) {
|
public Klass(ClassLoader classLoader, JavaClass javaClass) {
|
||||||
this.javaClass = javaClass;
|
this.javaClass = javaClass;
|
||||||
@@ -51,6 +59,14 @@ public class Klass {
|
|||||||
this.className = javaClass.getClassName();
|
this.className = javaClass.getClassName();
|
||||||
this.superClassName = javaClass.getSuperclassName();
|
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
|
// init staticFieldMap
|
||||||
for (Field field : javaClass.getFields()) {
|
for (Field field : javaClass.getFields()) {
|
||||||
if (field.isStatic()) {
|
if (field.isStatic()) {
|
||||||
@@ -58,8 +74,6 @@ public class Klass {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Metaspace.registerJavaClass(this);
|
|
||||||
|
|
||||||
// execute <clinit> method
|
// execute <clinit> method
|
||||||
if (!javaClass.getClassName().startsWith("java.")) {
|
if (!javaClass.getClassName().startsWith("java.")) {
|
||||||
for (Method method : javaClass.getMethods()) {
|
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) {
|
public KlassField getStaticField(String filedName) {
|
||||||
|
|||||||
@@ -2,7 +2,14 @@ package haidnor.jvm.test.clazz;
|
|||||||
|
|
||||||
public class Human {
|
public class Human {
|
||||||
|
|
||||||
|
public static final String HUMAN_NAME = "123";
|
||||||
|
|
||||||
|
static {
|
||||||
|
System.out.println("Human 类被加载了");
|
||||||
|
}
|
||||||
|
|
||||||
public void eat() {
|
public void eat() {
|
||||||
|
Object o = new Object();
|
||||||
System.out.println("人类吃饭");
|
System.out.println("人类吃饭");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,11 @@ public class Student extends Human {
|
|||||||
|
|
||||||
public static String school = "Hello World!";
|
public static String school = "Hello World!";
|
||||||
|
|
||||||
|
static {
|
||||||
|
System.out.println(HUMAN_NAME);
|
||||||
|
System.out.println("student 类被加载了");
|
||||||
|
}
|
||||||
|
|
||||||
public void method1() {
|
public void method1() {
|
||||||
System.out.println("method1");
|
System.out.println("method1");
|
||||||
method2();
|
method2();
|
||||||
|
|||||||
Reference in New Issue
Block a user