import java.io.*;
import java.util.Hashtable;
public class DirectClassLoader extends ClassLoader
{
protected final ClassLoader parent;
private final Hashtable definedClasses = new Hashtable();
public DirectClassLoader()
{
this(DirectClassLoader.class.getClassLoader());
}
public DirectClassLoader(ClassLoader _parent)
{
parent = _parent;
}
protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException
{
Class cls = findLoadedClass(name);
if (cls == null && parent != null)
{
try
{
cls = parent.loadClass(name);
}
catch (ClassNotFoundException e)
{
}
}
if (cls == null)
cls = findClass(name);
if (resolve)
resolveClass(cls);
return cls;
}
public Class loadClass(File file)throws ClassNotFoundException,IOException
{
return loadClass(new FileInputStream(file));
}
public Class loadClass(InputStream in)throws ClassNotFoundException,IOException
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
for(;;)
{
int l = in.read(buf);
if (l <= 0)
break;
out.write(buf,0,l);
}
in.close();
return loadClass(out.toByteArray());
}
public Class loadClass(byte[] b)throws ClassNotFoundException
{
return loadClass(b,0,b.length);
}
public Class loadClass(byte[] b,int off,int len) throws ClassNotFoundException
{
Class cls = defineClass(null,b,off,len);
definedClasses.put(cls.getName(),cls);
return loadClass(cls.getName());
}
protected Class findClass(String name) throws ClassNotFoundException
{
Class cls = (Class)definedClasses.get(name);
if (cls == null)
throw new ClassNotFoundException(name);
else
return cls;
}
}