001 import java.net.URL; 002 import java.net.URLClassLoader; 003 004 /** 005 * Class loader used so we can dynamically load classes. Normal class loader doesn't close the .jar 006 * so you can't reload. This fixes that. 007 * @author James 008 */ 009 public class MyClassLoader extends URLClassLoader { 010 011 /** 012 * Creates loader 013 * @param urls 014 * @param loader 015 */ 016 public MyClassLoader(URL[] urls, ClassLoader loader) { 017 super(urls, loader); 018 } 019 020 /** 021 * Fix here. 022 */ 023 public void close() { 024 try { 025 Class clazz = java.net.URLClassLoader.class; 026 java.lang.reflect.Field ucp = clazz.getDeclaredField("ucp"); 027 ucp.setAccessible(true); 028 Object sun_misc_URLClassPath = ucp.get(this); 029 java.lang.reflect.Field loaders = sun_misc_URLClassPath.getClass().getDeclaredField("loaders"); 030 loaders.setAccessible(true); 031 Object java_util_Collection = loaders.get(sun_misc_URLClassPath); 032 for (Object sun_misc_URLClassPath_JarLoader : ((java.util.Collection) java_util_Collection).toArray()) { 033 try { 034 java.lang.reflect.Field loader = sun_misc_URLClassPath_JarLoader.getClass().getDeclaredField("jar"); 035 loader.setAccessible(true); 036 Object java_util_jar_JarFile = loader.get(sun_misc_URLClassPath_JarLoader); 037 ((java.util.jar.JarFile) java_util_jar_JarFile).close(); 038 } catch (Throwable t) { 039 // if we got this far, this is probably not a JAR loader so 040 // skip it 041 } 042 } 043 } catch (Throwable t) { 044 // probably not a SUN VM 045 } 046 return; 047 } 048 }