package com.coderising.jvm.loader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ClassFileLoader { private List<String> clzPaths = new ArrayList<String>(); private static final int BUFFER_SIZE=1024; public byte[] readBinaryCode(String className) { className=className.replace(".","\\")+".class"; String absolutePath=null; for(int i=0;i<clzPaths.size();i++){ absolutePath=clzPaths.get(i)+"\\"+className; byte[]codes=loadClassFile(absolutePath); if(codes!=null){ return codes; } } return null; } private byte[] loadClassFile(String absolutePath) { File file=new File(absolutePath); FileInputStream fis = null; ByteArrayOutputStream baos=new ByteArrayOutputStream(); byte[]buffer=new byte[BUFFER_SIZE]; try { fis=new FileInputStream(file); while(baos.size()<file.length()){ int len=fis.read(buffer); if(len<0){ break; } baos.write(buffer, 0, len); } if(baos.size()>file.length()){ return Arrays.copyOf(baos.toByteArray(), (int) file.length()); } } catch (IOException e) { e.printStackTrace(); }finally{ try { fis.close(); baos.close(); } catch (IOException e) { e.printStackTrace(); } } return baos.toByteArray(); } public void addClassPath(String path) { if(this.clzPaths.contains(path)){ return; } clzPaths.add(path); } public String getClassPath(){ StringBuffer sb=new StringBuffer(); for(int i=0;i<clzPaths.size();i++){ if(i==0){ sb.append(clzPaths.get(i)); }else{ sb.append(";").append(clzPaths.get(i)); } } return sb.toString(); } }