package jadex.commons;
import java.util.HashMap;
import java.util.Map;
/**
* This class loader instantiate classes provided as a byte array.
*/
public class ByteClassLoader extends ClassLoader
{
//-------- attributes --------
/** The map of loaded classes. */
protected Map classes;
//-------- constructors --------
/**
* Create a new byte class loader.
*/
public ByteClassLoader(ClassLoader parent)
{
super(parent);
this.classes = new HashMap();
}
//-------- methods --------
/**
* Load a class via the classname.
* @param classname The class name.
* @return The class.
*/
public Class loadClass(String classname) throws ClassNotFoundException
{
return (loadClass(classname, true));
}
/**
* Load a class via the classname.
* @param classname The class name.
* @param resolve The resolve flag.
* @return The class.
*/
public Class loadClass(String classname, boolean resolve)
throws ClassNotFoundException
{
return loadClass(classname, null, resolve);
}
/**
* Load a class via the classname.
* @param classname The class name.
* @param resolve The resolve flag.
* @return The class.
*/
public synchronized Class loadClass(String classname, byte[] data, boolean resolve)
throws ClassNotFoundException
{
Class ret;
ret = (Class)classes.get(classname);
if(ret==null)
{
try
{
ret = super.findSystemClass(classname);
}
catch(ClassNotFoundException e)
{
if(data == null)
throw new ClassNotFoundException();
ret = defineClass(classname, data, 0, data.length);
if(ret == null)
throw new ClassFormatError();
if(resolve)
resolveClass(ret);
classes.put(classname, ret);
}
}
return ret;
}
}