package com.coding.mini_jvm.src.com.coderising.jvm.loader;
import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class ClassFileLoader {
private ClassLoader classLoader;
private static final String CLASS_FILE_SUFFIX = ".class";
private static List<String> clzPaths = new ArrayList<String>();
public byte[] readBinaryCode(String className) {
String classPath = getClassPath();
String[] paths = classPath.split(File.pathSeparator);
className = className.replace('.', File.separatorChar) ;
for (String path : paths) {
String clzFilename = path + File.separator + className + CLASS_FILE_SUFFIX;
byte[] data = loadClassFile(clzFilename);
if (data != null) {
return data;
}
}
return null;
}
private byte[] loadClassFile(String clzFileName) {
File file = new File(clzFileName);
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream(file));
byte[] data = new byte[bis.available()];
bis.read(data);
return data;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public void addClassPath(String path) {
if (this.clzPaths.contains(path)) {
return;
}
clzPaths.add(path);
}
public String getClassPath(){
StringBuffer sb = new StringBuffer();
for (String path : clzPaths) {
sb.append(path);
sb.append(";");
}
String path = sb.toString();
return path.substring(0, path.lastIndexOf(";"));
}
public ClassFile loadClass(String className) {
byte[] data = readBinaryCode(className);
ClassFileParser classFileParser = new ClassFileParser();
return classFileParser.parse(data);
}
// public static void main(String[] args) {
//
//
// System.out.println(System.getProperty("java.library.path"));
// System.out.println(System.getProperty("java.class.path"));
// System.out.println(System.getProperty("java.home"));
//// System.getProperty("java.class.path");
//// System.getProperty("java.class.path");
//// System.getProperty("java.class.path");
//// System.getProperty("java.class.path");
//
// }
private class MyClassLoader extends ClassLoader {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
String filename = name.substring(name.lastIndexOf(".")+1) + ".class";
try {
InputStream is = getClass().getResourceAsStream(filename);
if (is == null) {
return super.loadClass(name);
}
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name, b, 0, b.length);
} catch (IOException e) {
e.printStackTrace();
}
return super.loadClass(name);
}
}
}