package com.coderising.jvm.loader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import com.coderising.jvm.clz.ClassFile; public class ClassFileLoader { private List<String> clzPaths = new ArrayList<String>(); public byte[] readBinaryCode(String className) { className = className.replace('.', File.separatorChar) +".class"; for(String path : this.clzPaths){ String clzFileName = path + File.separatorChar + className; byte[] codes = loadClassFile(clzFileName); if(codes != null){ return codes; } } return null; } private byte[] loadClassFile(String fileName) { ArrayList<Byte> list=new ArrayList<Byte>(); try { InputStream in=new FileInputStream(fileName.toString()); int length=-1; byte[] buffer=new byte[1024]; while ((length=in.read(buffer))!=-1) { int size=list.size(); for (int i = size; i < size+length; i++) { list.add(buffer[i-size]); } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } byte[] byteCodes=new byte[list.size()]; for (int i = 0; i < byteCodes.length; i++) { byteCodes[i]=list.get(i); } return byteCodes; } public ClassFile loadClass(String className) { byte[] codes = this.readBinaryCode(className); ClassFileParser parser = new ClassFileParser(); return parser.parse(codes); } public void addClassPath(String path) { clzPaths.add(path); } public String getClassPath(){ String string=""; for (int i = 0; i < clzPaths.size(); i++) { string=i==0?string+clzPaths.get(i):string+";"+clzPaths.get(i); } return string; } }