package io.github.jordandoyle.helpers.classloader; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.Vector; import org.apache.commons.io.FilenameUtils; /** * This class helps you load JARs and folders onto the system classloader. This * makes the classloader also look through these JAR files (or folders) for * classes. * * @author Jordan Doyle * */ public class Loader { /** * Adds a JAR file to the classpath * * @param f * Link to JAR File * @throws Exception */ public static void addJar(String f) throws Exception { addJar(new File(f)); } /** * Adds a JAR file to the classpath * * @param f * Link to JAR File * @throws Exception */ public static void addJar(File f) throws Exception { String ext = FilenameUtils.getExtension(f.getName()); if (ext == "") throw new Exception("Could not find extension of file"); if (ext.toLowerCase() != "jar") throw new Exception("Cannot inject non-jar file into classpath"); addURL(f.toURI().toURL()); } /** * This method allows you add a folder to the classpath * * @param u * URL to add to the classpath * @throws Exception */ public static void addURL(URL u) throws Exception { File f = new File(u.toURI()); if (!f.isDirectory() && !FilenameUtils.getExtension(f.getName()).equalsIgnoreCase( "jar")) { throw new Exception( "addURL requires a directory to add to classpath"); } Method m = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class }); m.setAccessible(true); m.invoke(ClassLoader.getSystemClassLoader(), new Object[] { u }); } /** * Returns all classes loaded in the system class loader * * @return all loaded classes * @throws Exception */ public static Vector getAllClasses(ClassLoader classLoader) throws Exception { Field f = ClassLoader.class.getDeclaredField("classes"); f.setAccessible(true); Vector classes = (Vector) f.get(classLoader); return classes; } /** * Returns all classes loaded in the system class loader * * @return all loaded classes * @throws Exception */ public static Vector getAllClasses() throws Exception { return getAllClasses(ClassLoader.getSystemClassLoader()); } }