/** {@inheritDoc} */ @Override public final Class<?> findClass(String name) throws ClassNotFoundException { ClassNotFoundException rethrow = null; Class<?> toRet = null; try { toRet = super.findClass(name); // Look for the class normally } catch (ClassNotFoundException cnfex) { rethrow = cnfex; // And fail } catch (LinkageError lerr) { toRet = null; // And fail ignored } if (toRet != null) { ccw.addClass(this, toRet); // return toRet; } else { toRet = ccw.findLoadedClass(name); if (toRet != null) { return toRet; } else { rethrow = new ClassNotFoundException("The class " + name + " could not be found!", rethrow); } } throw rethrow; }
/** Closes the loader and jar file */ public final synchronized void close() { if (System.getProperty("java.version") .startsWith("1.6")) { // Java 6 doesn't have the URLClassLoader.close() method try { // Insert Reflection Magic Class<?> clazz = URLClassLoader.class; Field ucpField = clazz.getDeclaredField("ucp"); // get field for sun.misc.URLClassPath ucpField.setAccessible(true); // Allow access Object ucp = ucpField.get(this); // get URLClassPath instance Field loadersField = ucp.getClass().getDeclaredField("loaders"); // get the loaders collection loadersField.setAccessible(true); // Allow access Object loaders = loadersField.get(ucp); // get loaders for (Object jarLoader : ((Collection<?>) loaders)) { // iterate the loaders try { Field jarField = jarLoader.getClass().getDeclaredField("jar"); // Get the jarField jarField.setAccessible(true); // Allow access Object jarFile = jarField.get(jarLoader); // get the JarFile ((JarFile) jarFile).close(); // Close jar } catch (Throwable t) { // Not a loader, ignored... } } } catch (Throwable t) { // probably not a SUN/Oracle VM } } else { // If running on Java 7 or above, call URLClassLoader.close(). Since we should be // compiling with Java 6, lower versions shouldn't be a worry try { // We have to invoke the method since we compile with Java 6 (or should be) URLClassLoader.class.getDeclaredMethod("close").invoke(this); } catch (Exception ex) { // Probably IOException, ignore it. } } ccw.removeLoader(this); // And finally remove url and classes from the jar }