public Class generateProxyClass()

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);
            }
        }