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