package ilarkesto.io; import ilarkesto.core.logging.Log; import java.io.File; import java.net.URL; import java.util.HashMap; import java.util.Map; public class DynamicClassLoader extends ClassLoader { private static final Log LOG = Log.get(DynamicClassLoader.class); private String[] packages; private Map<String, Long> typeModificationTimes = new HashMap<String, Long>(); public DynamicClassLoader(ClassLoader parent, String... packages) { super(parent); this.packages = packages; if (packages.length == 0) throw new IllegalArgumentException("At least one package required"); } @Override public Class<?> loadClass(String name) throws ClassNotFoundException { for (String pack : packages) { if (name.startsWith(pack)) { String typeName = name.replace('.', '/') + ".class"; URL url = getParent().getResource(typeName); String fileName = url.getFile(); File file = new File(fileName); if (!file.exists()) throw new RuntimeException("File does not exist: " + file.getPath()); // Long lastModified = typeModificationTimes.get(name); // if (lastModified != null && lastModified == file.lastModified()) { // // } // // typeModificationTimes.put(name, file.lastModified()); LOG.debug("Defining class:", name); byte[] data = IO.readFileToByteArray(file); Class<?> type = defineClass(name, data, 0, data.length); resolveClass(type); return type; } } return super.loadClass(name); } }