fix bug execute <clinit>

This commit is contained in:
wangxiang
2023-07-21 16:21:36 +08:00
parent 05affb1a80
commit f360ac0e3f
4 changed files with 20 additions and 45 deletions

View File

@@ -1,12 +1,8 @@
package haidnor.jvm.classloader; package haidnor.jvm.classloader;
import haidnor.jvm.core.JavaExecutionEngine;
import haidnor.jvm.rtda.heap.Klass; import haidnor.jvm.rtda.heap.Klass;
import haidnor.jvm.rtda.heap.KlassMethod;
import haidnor.jvm.rtda.metaspace.Metaspace;
import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.Method;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@@ -63,36 +59,13 @@ public class ClassLoader {
} }
JavaClass javaClass = classParser.parse(); JavaClass javaClass = classParser.parse();
Klass klass = new Klass(this, javaClass); return new Klass(this, javaClass);
Metaspace.registerJavaClass(klass);
if (!classPath.startsWith("java/")) {
// do clinit
for (Method method : javaClass.getMethods()) {
if (method.toString().equals("static void <clinit>()")) {
KlassMethod klassMethod = new KlassMethod(klass, method);
JavaExecutionEngine.callMethod(null, klassMethod);
break;
}
}
}
return klass;
} }
public Klass loadClassWithAbsolutePath(String absolutePath) throws IOException { public Klass loadClassWithAbsolutePath(String absolutePath) throws IOException {
ClassParser classParser = new ClassParser(absolutePath); ClassParser classParser = new ClassParser(absolutePath);
JavaClass javaClass = classParser.parse(); JavaClass javaClass = classParser.parse();
Klass klass = new Klass(this, javaClass); return new Klass(this, javaClass);
Metaspace.registerJavaClass(klass);
// do clinit
for (Method method : javaClass.getMethods()) {
if (method.toString().equals("static void <clinit>()")) {
KlassMethod klassMethod = new KlassMethod(klass, method);
JavaExecutionEngine.callMethod(null, klassMethod);
break;
}
}
return klass;
} }
} }

View File

@@ -1,9 +1,12 @@
package haidnor.jvm.rtda.heap; package haidnor.jvm.rtda.heap;
import haidnor.jvm.classloader.ClassLoader; import haidnor.jvm.classloader.ClassLoader;
import haidnor.jvm.core.JavaExecutionEngine;
import haidnor.jvm.rtda.metaspace.Metaspace;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.Field;
import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -53,6 +56,19 @@ public class Klass {
} }
} }
Metaspace.registerJavaClass(this);
// execute <clinit> method
if (!javaClass.getClassName().startsWith("java.")) {
for (Method method : javaClass.getMethods()) {
if (method.toString().equals("static void <clinit>()")) {
KlassMethod klassMethod = new KlassMethod(this, method);
JavaExecutionEngine.callMethod(null, klassMethod);
break;
}
}
}
// loader super class // loader super class
JavaClass superJavaClass = javaClass.getSuperClass(); JavaClass superJavaClass = javaClass.getSuperClass();
if (superJavaClass != null) { if (superJavaClass != null) {

View File

@@ -1,17 +1,5 @@
package haidnor.jvm.test.clazz; package haidnor.jvm.test.clazz;
public class Student extends Human { public class Student extends Human {
public static String school = "家里蹲大学"; public static String school = "家里蹲大学";
public String name;
public void printSchool() {
System.out.println(school);
}
public static Student newStudent() {
return new Student();
}
} }

View File

@@ -5,10 +5,8 @@ import haidnor.jvm.test.clazz.Student;
public class Demo4 { public class Demo4 {
public static void main(String[] args) { public static void main(String[] args) {
Student student = Student.newStudent(); Student student = new Student();
student.eat(); System.out.println(Student.school);
student.name = "张三";
System.out.println(student.name);
} }
} }