package freenet.support;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Hashtable;
/**
* @author <a href=mailto:blanu@uts.cc.utexas.edu>Brandon Wiley</a>
* @author oskar (I made this a generic loader, not just for messages).
**/
public class Loader {
static final private Hashtable classes=new Hashtable();
// static final public String prefix="freenet.message.";
/**
* This is a caching Class loader.
* @param name The name of the class to load.
**/
static public Class load(String name) throws ClassNotFoundException {
Class c=(Class)classes.get(name);
if(c==null) {
c=Class.forName(name);
classes.put(name, c);
}
return c;
}
/**
* Creates a new object of given classname.
* @param classname Name of class to instantiate.
**/
public static Object getInstance(String classname)
throws InvocationTargetException, NoSuchMethodException,
InstantiationException, IllegalAccessException,
ClassNotFoundException {
return getInstance(classname,new Class[] {}, new Object[] {});
}
/**
* Creates a new object of given classname.
* @param classname Name of class to instantiate.
* @param argtypes The classes of the arguments.
* @param args The arguments. Since this uses the reflect methods
* it's ok to wrap primitives.
**/
public static Object getInstance(String classname, Class[] argtypes,
Object[] args)
throws InvocationTargetException, NoSuchMethodException,
InstantiationException, IllegalAccessException,
ClassNotFoundException {
return getInstance(load(classname),argtypes,args);
}
/**
* Creats a new object of a given class.
* @param c The class to instantiate.
* @param argtypes The classes of the arguments.
* @param args The arguments. Since this uses the reflect methods
* it's ok to wrap primitives.
**/
public static Object getInstance(Class c, Class[] argtypes,
Object[] args)
throws InvocationTargetException, NoSuchMethodException,
InstantiationException, IllegalAccessException {
Constructor con = c.getConstructor(argtypes);
return con.newInstance(args);
}
}