From efb5ad9f5fe48a77b6cd14e7bd2b25e3b13ecb1f Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 3 Jun 2014 16:44:56 +0200 Subject: Initial commit --- .../openslx/taskmanager/util/ClassLoaderHack.java | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java (limited to 'daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java') diff --git a/daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java b/daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java new file mode 100644 index 0000000..1a02ff7 --- /dev/null +++ b/daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java @@ -0,0 +1,66 @@ +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, true, ClassLoader.getSystemClassLoader() ); + } catch ( ClassNotFoundException e ) { + return null; + } + if ( clazz == null || ( baseClass != null && !baseClass.isAssignableFrom( clazz ) ) ) { + return null; + } + return (Class)clazz; + } + +} -- cgit v1.2.3-55-g7522