package org.openslx.taskmanager.util; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; public class ClassLoaderHack { @SuppressWarnings( "rawtypes" ) private static final Class[] parameters = new Class[] { URL.class }; public static void addFile( String s ) throws IOException { File f = new File( s ); addFile( f ); } public static void addFile( File f ) throws IOException { addURL( f.toURI().toURL() ); } public static void addURL( URL u ) throws IOException { URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader(); Class sysclass = URLClassLoader.class; try { Method method = sysclass.getDeclaredMethod( "addURL", parameters ); method.setAccessible( true ); method.invoke( sysloader, new Object[] { u } ); System.out.println( "Loaded " + u.toString() ); } catch ( Throwable t ) { t.printStackTrace(); throw new IOException( "Error, could not add URL to system classloader" ); } } /** * Get Class meta-object for given class in package. Only return class if it's somehow * extending from given baseClass. * * @param packageName package to search in * @param className name of class to look for * @param baseClass class the class in question has to be extended from * @return class meta object, or null if not found */ @SuppressWarnings( "unchecked" ) public static Class getClass( String packageName, String className, Class baseClass ) { final Class clazz; try { clazz = Class.forName( packageName + '.' + className ); } catch ( ClassNotFoundException e ) { return null; } if ( clazz == null || ( baseClass != null && !baseClass.isAssignableFrom( clazz ) ) ) { return null; } return (Class)clazz; } }