import java.net.URL; import java.net.URLClassLoader; /** * Class loader used so we can dynamically load classes. Normal class loader * doesn't close the .jar so you can't reload. This fixes that. * * @author James */ public class MyClassLoader extends URLClassLoader { /** * Creates loader * * @param urls * @param loader */ public MyClassLoader(URL[] urls, ClassLoader loader) { super(urls, loader); } /** * Fix here. */ public void close() { try { Class<?> clazz = java.net.URLClassLoader.class; java.lang.reflect.Field ucp = clazz.getDeclaredField("ucp"); ucp.setAccessible(true); Object sun_misc_URLClassPath = ucp.get(this); java.lang.reflect.Field loaders = sun_misc_URLClassPath.getClass().getDeclaredField("loaders"); loaders.setAccessible(true); Object java_util_Collection = loaders.get(sun_misc_URLClassPath); for (Object sun_misc_URLClassPath_JarLoader : ((java.util.Collection) java_util_Collection).toArray()) try { java.lang.reflect.Field loader = sun_misc_URLClassPath_JarLoader.getClass().getDeclaredField("jar"); loader.setAccessible(true); Object java_util_jar_JarFile = loader.get(sun_misc_URLClassPath_JarLoader); ((java.util.jar.JarFile) java_util_jar_JarFile).close(); } catch (Throwable t) { // if we got this far, this is probably not a JAR loader so // skip it } } catch (Throwable t) { // probably not a SUN VM } return; } }