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