package com.coderising.jvm.loader; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.coderising.jvm.clasfile.ClassFile; public class ClassFileLoader { private List<String> list = new ArrayList<String>(); public ClassFileLoader() { } public void addClassPath(String path) { if (list.contains(path)) { return; } list.add(path); } public String getClassPath() { if (list.size() == 0 || list == null) { return null; } StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < list.size(); i++) { if (i == list.size() - 1) { stringBuilder.append(list.get(i)); } else { stringBuilder.append(list.get(i)).append(";"); } } return stringBuilder.toString(); } public byte[] readBinaryCode(String className){ String clzName = className.replace(".", File.separator) + ".class"; for(String path : list){ String fileName = path + File.separator + clzName; byte[] codes = loadClassFile(fileName); if (codes != null) { return codes; } } return null; } private byte[] loadClassFile(String fileName){ BufferedInputStream bis = null; File classFile = new File(fileName); try { bis = new BufferedInputStream(new FileInputStream(classFile)); byte[] bytes_code = new byte[1024]; int len = 0; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while((len = bis.read(bytes_code)) != -1){ baos.write(bytes_code, 0, len); } return baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally{ if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } public ClassFile loadClass(String className) { byte[] codes = this.readBinaryCode(className); ClassFileParser clzPaser = new ClassFileParser(); return clzPaser.parse(codes); } }