mirror of
https://github.com/FranzHaidnor/haidnorJVM.git
synced 2026-03-29 02:03:42 +08:00
fix bug execute <clinit>
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user