package org.jboss.proxy.compiler;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.io.InputStream;
import java.net.URL;
import java.security.PrivilegedAction;
import java.security.AccessController;
public class Runtime
extends ClassLoader
{
public final static String RUNTIME_FN = "runtime";
public Runtime(ClassLoader parent)
{
super(parent);
}
Class targetTypes[];
Method methods[];
ProxyCompiler compiler;
public Class[] copyTargetTypes()
{
return (Class[]) targetTypes.clone();
}
public Object invoke(InvocationHandler invocationHandler, int methodNum, Object values[])
throws Throwable
{
return invocationHandler.invoke(null, methods[methodNum], values);
}
void makeProxyType(ProxyCompiler compiler)
throws Exception
{
this.compiler = compiler; byte code[] = compiler.getCode();
compiler.proxyType = super.defineClass(compiler.getProxyClassName(), code, 0, code.length);
super.resolveClass(compiler.proxyType);
Field field = compiler.proxyType.getField(RUNTIME_FN);
field.set(null, this);
compiler = null;
}
ClassLoader getTargetClassLoader()
{
PrivilegedAction action = new PrivilegedAction()
{
public Object run()
{
return getParent();
}
};
return (ClassLoader) AccessController.doPrivileged(action);
}
public synchronized Class loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
if (name.endsWith("$Proxy") && name.equals(compiler.getProxyClassName()))
{
return compiler.proxyType;
}
ClassLoader cl = getTargetClassLoader();
if (cl == null)
{
return super.findSystemClass(name);
}
return cl.loadClass(name);
}
public InputStream getResourceAsStream(String name)
{
ClassLoader cl = getTargetClassLoader();
if (cl == null)
{
return super.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
public URL getResource(String name)
{
ClassLoader cl = getTargetClassLoader();
if (cl == null)
{
return super.getSystemResource(name);
}
return cl.getResource(name);
}
}