package org.basex.util; import java.lang.reflect.*; import java.net.*; import java.util.*; import java.util.zip.*; /** * Custom class loader for loading jar files. This class is needed because JDK * does not offer a fine and easy way to delete open jars: * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5041014 * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen * @author Rositsa Shadura */ public final class JarLoader extends URLClassLoader { /** * Constructor. * @param urls of jars to be loaded * @param parent the parent class loader for delegation */ public JarLoader(final URL[] urls, final ClassLoader parent) { super(urls, parent); } @Override public void close() { try { final Field ucp = URLClassLoader.class.getDeclaredField("ucp"); ucp.setAccessible(true); final Object cp = ucp.get(this); final Field loaders = cp.getClass().getDeclaredField("loaders"); loaders.setAccessible(true); for(final Object jl : (Collection<?>) loaders.get(cp)) { try { final Field jar = jl.getClass().getDeclaredField("jar"); jar.setAccessible(true); ((ZipFile) jar.get(jl)).close(); } catch(final Throwable th) { Util.errln(th); } } } catch(final Throwable th) { Util.errln(th); } } }