Re: alternative to my ClassLoader hack
Mark Space wrote:
For making your own URLClassLoader, just do it. Load your first class
with it, and invoke a method. Everthing afterthat will automatically
use the classloader it was invoked with, yours, and the URLClassLoader
automatically invokes it's parent to load classes it doesn't know about.
I haven't tried this, but I did look into it a while ago. Here's my
little sample:
I'm not sure this is going to work. Stop me if I'm wrong...
public class MyClassLoader
{
public static void main( String... args )
throws ClassNotFoundException, InstantiationException,
IllegalAccessException
{
URL[] urls;
urls = null; //... add some
URLClassLoader cl = new URLClassLoader( urls );
@SuppressWarnings("unchecked")
Class<MyClassLoader> main = (Class<MyClassLoader>) cl.
loadClass( "fubar.MyClassLoader" );
Try comparing 'main' with Class.forName("fubar.MyClassLoader") (i.e.
using the system classloader). 'cl' will always try its parent first
before looking for anything itself, so it should return the same thing.
Therefore, the new instance of 'main' will still be using the system
classloader. You'd have to use 'cl' to load a different class.
I'd go with something like this:
import java.lang.reflect.Method;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
public class MyClassLoader {
public static void main(String... args) throws Exception {
// Using subdir of current directory as example.
File curDir = new File(System.getProperty("user.dir"));
curDir = new File(curDir, "subdir").getCanonicalFile();
URL[] urls = { curDir.toURI().toURL() };
ClassLoader cl = new URLClassLoader(urls);
Class<?> main = Class.forName("TheRealMainClass", true, cl);
Method mth = main.getMethod("main", args.getClass());
mth.invoke(null, (Object[]) args);
}
}
--
ss at comp dot lancs dot ac dot uk