package me.lzb.jvm.loader; import me.lzb.common.utils.FileUtils; import me.lzb.jvm.clz.ClassFile; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ClassFileLoader { private List<String> clzPaths = new ArrayList<>(); public byte[] readBinaryCode(String className) throws IOException { className = className.replace('.', File.separatorChar) + ".class"; for (String s : clzPaths) { byte[] data = FileUtils.readByteCodes(s + className); if (data != null) { return data; } } throw new IOException(className + "is not exist"); } public void addClassPath(String path) { clzPaths.add(path); } public String getClassPath() { StringBuilder buffer = new StringBuilder(); for (Iterator<String> iterator = clzPaths.iterator(); iterator.hasNext(); ) { buffer.append(iterator.next() + (iterator.hasNext() ? ";" : "")); } return buffer.toString(); } public ClassFile loadClass(String className) { byte[] codes; try { codes = this.readBinaryCode(className); } catch (IOException e) { return null; } ClassFileParser parser = new ClassFileParser(codes); return parser.parse(); } }