private static Class createInvocationClass()

in javassist/src/main/java/org/apache/commons/proxy2/javassist/JavassistInvocation.java [81:142]


    private static Class<?> createInvocationClass(ClassLoader classLoader, Method interfaceMethod)
            throws CannotCompileException
    {
        final CtClass ctClass = JavassistUtils.createClass(getSimpleName(interfaceMethod.getDeclaringClass()) + "_"
                + interfaceMethod.getName() + "_invocation", JavassistInvocation.class);
        final CtConstructor constructor = new CtConstructor(JavassistUtils.resolve(new Class[] { Object.class,
                Object.class, Method.class, Object[].class }), ctClass);
        constructor.setBody("{\n\tsuper($$);\n}");
        ctClass.addConstructor(constructor);
        final CtMethod proceedMethod = new CtMethod(JavassistUtils.resolve(Object.class), "proceed",
                JavassistUtils.resolve(new Class[0]), ctClass);
        final Class<?>[] argumentTypes = interfaceMethod.getParameterTypes();
        final StringBuilder proceedBody = new StringBuilder("{\n");
        if (!Void.TYPE.equals(interfaceMethod.getReturnType()))
        {
            proceedBody.append("\treturn ");
            if (interfaceMethod.getReturnType().isPrimitive())
            {
                proceedBody.append("new ");
                proceedBody.append(ProxyUtils.getWrapperClass(interfaceMethod.getReturnType()).getName());
                proceedBody.append("( ");
            }
        }
        else
        {
            proceedBody.append("\t");
        }
        proceedBody.append("( (");
        proceedBody.append(ProxyUtils.getJavaClassName(interfaceMethod.getDeclaringClass()));
        proceedBody.append(" )getTarget() ).");
        proceedBody.append(interfaceMethod.getName());
        proceedBody.append("(");
        for (int i = 0; i < argumentTypes.length; ++i)
        {
            final Class<?> argumentType = argumentTypes[i];
            proceedBody.append(createCastExpression(argumentType, "getArguments()[" + i + "]"));
            if (i != argumentTypes.length - 1)
            {
                proceedBody.append(", ");
            }
        }
        if (!Void.TYPE.equals(interfaceMethod.getReturnType()) && interfaceMethod.getReturnType().isPrimitive())
        {
            proceedBody.append(") );\n");
        }
        else
        {
            proceedBody.append(");\n");
        }
        if (Void.TYPE.equals(interfaceMethod.getReturnType()))
        {
            proceedBody.append("\treturn null;\n");
        }
        proceedBody.append("}");
        final String body = proceedBody.toString();
        proceedMethod.setBody(body);
        ctClass.addMethod(proceedMethod);

        @SuppressWarnings("deprecation")
        final Class<?> invocationClass = ctClass.toClass(classLoader);
        return invocationClass;
    }