void addMethod(Method method) { final Class[] paramTypes = method.getParameterTypes(); addCallableMemberDescriptor(new ReflectionCallableMemberDescriptor(method, paramTypes)); }
@Override String getDeclaration() { return callableMemberDesc.getDeclaration(); }
@Override String getName() { return callableMemberDesc.getName(); }
@Override Class<?>[] getParamTypes() { return callableMemberDesc.getParamTypes(); }
@Override boolean isVarargs() { return callableMemberDesc.isVarargs(); }
@Override TemplateModel invokeMethod(BeansWrapper bw, Object obj, Object[] args) throws TemplateModelException, InvocationTargetException, IllegalAccessException { convertArgsToReflectionCompatible(bw, args); return callableMemberDesc.invokeMethod(bw, obj, args); }
@Override Object invokeConstructor(BeansWrapper bw, Object[] args) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, TemplateModelException { convertArgsToReflectionCompatible(bw, args); return callableMemberDesc.invokeConstructor(bw, args); }
@Override boolean isStatic() { return callableMemberDesc.isStatic(); }
@Override boolean isConstructor() { return callableMemberDesc.isConstructor(); }
private void convertArgsToReflectionCompatible(BeansWrapper bw, Object[] args) throws TemplateModelException { Class<?>[] paramTypes = callableMemberDesc.getParamTypes(); int ln = paramTypes.length; for (int i = 0; i < ln; i++) {
private void addCallableMemberDescriptor(ReflectionCallableMemberDescriptor memberDesc) { // Note: "varargs" methods are always callable as fixed args, with a sequence (array) as the last parameter. fixArgMethods.addCallableMemberDescriptor(memberDesc); if (memberDesc.isVarargs()) { if (varargMethods == null) { varargMethods = new OverloadedVarArgsMethods(bugfixed); } varargMethods.addCallableMemberDescriptor(memberDesc); } }
@Override TemplateModel invokeMethod(BeansWrapper bw, Object obj, Object[] args) throws TemplateModelException, InvocationTargetException, IllegalAccessException { convertArgsToReflectionCompatible(bw, args); return callableMemberDesc.invokeMethod(bw, obj, args); }
@Override Object invokeConstructor(BeansWrapper bw, Object[] args) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, TemplateModelException { convertArgsToReflectionCompatible(bw, args); return callableMemberDesc.invokeConstructor(bw, args); }
@Override boolean isStatic() { return callableMemberDesc.isStatic(); }
@Override boolean isConstructor() { return callableMemberDesc.isConstructor(); }
void addConstructor(Constructor constr) { final Class[] paramTypes = constr.getParameterTypes(); addCallableMemberDescriptor(new ReflectionCallableMemberDescriptor(constr, paramTypes)); }
final Class<?>[] paramTypes = memberDesc.getParamTypes(); final int cl = types.length; final int fl = paramTypes.length - (varArg ? 1 : 0);
@Override boolean isVarargs() { return callableMemberDesc.isVarargs(); }
@Override TemplateModel invokeMethod(BeansWrapper bw, Object obj, Object[] args) throws TemplateModelException, InvocationTargetException, IllegalAccessException { convertArgsToReflectionCompatible(bw, args); return callableMemberDesc.invokeMethod(bw, obj, args); }
@Override Object invokeConstructor(BeansWrapper bw, Object[] args) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, TemplateModelException { convertArgsToReflectionCompatible(bw, args); return callableMemberDesc.invokeConstructor(bw, args); }