/* Copyright (c) 2006, Sriram Srinivasan * * You may distribute this software under the terms of the license * specified in the file "License" */ package kilim.test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; public class TaskTestClassLoader extends ClassLoader { static String wclassDir; static { URL baseURL = Thread.currentThread().getContextClassLoader().getResource("kilim/test/TaskTestClassLoader.class"); String path = baseURL.getPath(); wclassDir = path.substring(0, path.indexOf("/classes/")) + "/wclasses/"; } public TaskTestClassLoader(ClassLoader aParent) { super(aParent); } @Override public Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException { Class<?> ret = findLoadedClass(className); if (ret == null && className.startsWith("kilim")) { File f = new File(wclassDir + className.replace('.', '/') + ".class"); if (f.exists()) { try { byte[] bytes = getBytes(f); // if (resolve) { ret = defineClass(className, bytes, 0, bytes.length); // } } catch (IOException ioe) { System.err.println("Error loading class " + className + " from file " + f.getPath()); ioe.printStackTrace(); // Not supposed to happen System.exit(1); } } } if (ret == null) { return resolve ? findSystemClass(className) : getParent().loadClass(className); } else { return ret; } } private byte[] getBytes(File f) throws IOException { int size = (int)f.length(); byte[] bytes = new byte[size]; int remaining = size; int i = 0; FileInputStream fis = new FileInputStream(f); while (remaining > 0) { int n = fis.read(bytes, i, remaining); if (n == -1) break; remaining -= n; i += n; } return bytes; } public static void main(String[] args) throws Exception { Class<?> c = new TaskTestClassLoader(Thread.currentThread().getContextClassLoader()).loadClass(args[0], true); c.newInstance(); } }