in javassist/src/main/java/org/apache/commons/proxy2/javassist/JavassistProxyFactory.java [238:273]
public Class<?> generateProxyClass(ClassLoader classLoader, Class<?>... proxyClasses)
{
try
{
final CtClass proxyClass = JavassistUtils.createClass(getSuperclass(proxyClasses));
final Method[] methods = getImplementationMethods(proxyClasses);
JavassistUtils.addInterfaces(proxyClass, toInterfaces(proxyClasses));
JavassistUtils.addField(Invoker.class, "invoker", proxyClass);
final CtConstructor proxyConstructor = new CtConstructor(
JavassistUtils.resolve(new Class[] { Invoker.class }), proxyClass);
proxyConstructor.setBody("{\n\tthis.invoker = $1; }");
proxyClass.addConstructor(proxyConstructor);
addGetMethodMethod(proxyClass);
addHashCodeMethod(proxyClass);
addEqualsMethod(proxyClass);
for (int i = 0; i < methods.length; ++i)
{
if (!ProxyUtils.isEqualsMethod(methods[i]) && !ProxyUtils.isHashCode(methods[i]))
{
final CtMethod method = new CtMethod(JavassistUtils.resolve(methods[i].getReturnType()),
methods[i].getName(), JavassistUtils.resolve(methods[i].getParameterTypes()),
proxyClass);
final String body = "{\n\t return ( $r ) invoker.invoke( this, " + GET_METHOD_METHOD_NAME
+ "(\"" + methods[i].getDeclaringClass().getName() + "\", \"" + methods[i].getName()
+ "\", $sig), $args );\n }";
method.setBody(body);
proxyClass.addMethod(method);
}
}
return proxyClass.toClass(classLoader, null);
}
catch (CannotCompileException e)
{
throw new ProxyFactoryException("Could not compile class.", e);
}
}