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    }