in javassist/src/main/java/org/apache/commons/proxy2/javassist/JavassistProxyFactory.java [173:214]
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(Object.class, "target", proxyClass);
JavassistUtils.addField(Interceptor.class, "interceptor", proxyClass);
addGetMethodMethod(proxyClass);
addHashCodeMethod(proxyClass);
addEqualsMethod(proxyClass);
final CtConstructor proxyConstructor = new CtConstructor(JavassistUtils.resolve(new Class[] {
Object.class, Interceptor.class }), proxyClass);
proxyConstructor.setBody("{\n\tthis.target = $1;\n\tthis.interceptor = $2; }");
proxyClass.addConstructor(proxyConstructor);
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 Class<?> invocationClass = JavassistInvocation.getMethodInvocationClass(classLoader,
methods[i]);
final String body = "{\n\t return ( $r ) interceptor.intercept( new "
+ invocationClass.getName() + "( this, target, " + 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);
}
}