public static Object invokeMethod()

in empire-db/src/main/java/org/apache/empire/commons/ClassUtils.java [547:603]


    public static Object invokeMethod(Class<?> clazz, Object object, String methodName, Class<?>[] paramTypes, Object[] paramValues, boolean makeAccessible)
    {
        // check arguments
        if (clazz==null || !clazz.isInstance(object))
            throw new InvalidArgumentException("clazz", clazz);
        if (StringUtils.isEmpty(methodName))
            throw new InvalidArgumentException("methodName", methodName);
        // method parameters
        boolean hasMethodParams = (paramTypes!=null && paramTypes.length>0); 
        if (hasMethodParams && (paramValues==null || paramValues.length!=paramTypes.length))
            throw new InvalidArgumentException("paramValues", paramValues);
        // begin
        boolean accessible = true; 
        Method method = null;
        try
        {   // find method and invoke
            if (hasMethodParams)
                method = (makeAccessible ? clazz.getDeclaredMethod(methodName, paramTypes) : clazz.getMethod(methodName, paramTypes));
            else
                method = (makeAccessible ? clazz.getDeclaredMethod(methodName) : clazz.getMethod(methodName));
            // set Accessible
            accessible = method.isAccessible();
            if (makeAccessible && accessible==false)
                method.setAccessible(true);
            // invoke
            if (hasMethodParams)
                return method.invoke(object, paramValues);
            else
                return method.invoke(object);
        }
        catch (NoSuchMethodException e)
        {   // No such Method
            if (makeAccessible)
            {   // try superclass
                clazz = clazz.getSuperclass();
                if (clazz!=null && !clazz.equals(java.lang.Object.class))
                    return invokeMethod(clazz, object, methodName, paramTypes, paramValues, true);
            }
            // not found
            if (hasMethodParams)
                methodName += StringUtils.concat("({", String.valueOf(paramTypes.length), " params})");
            throw new NotImplementedException(object, methodName);
        }
        catch (IllegalAccessException | InvocationTargetException e)
        {   // ReflectiveOperationException   
            throw new BeanMethodInvokeException(object, methodName, e);
        }
        catch (SecurityException | IllegalArgumentException e)
        {   // RuntimeException   
            throw new BeanMethodInvokeException(object, methodName, e);
        }
        finally {
            // restore accessible
            if (method!=null && accessible==false)
                method.setAccessible(false);
        }
    }