public static Object invokeExactMethod(Object object, String methodName,
            Object[] args, Class<?>[] parameterTypes)
            throws NoSuchMethodException, IllegalAccessException,
            InvocationTargetException {
        if (args == null) {
            args = ArrayUtils.EMPTY_OBJECT_ARRAY;
        }
        if (parameterTypes == null) {
            parameterTypes = ArrayUtils.EMPTY_CLASS_ARRAY;
        }
        Method method = getAccessibleMethod(object.getClass(), methodName,
                parameterTypes);
        if (method == null) {
            throw new NoSuchMethodException("No such accessible method: "
                    + methodName + "() on object: "
                    + object.getClass().getName());
        }
        return method.invoke(object, args);
    }
<p>Invokes a method whose parameter types match exactly the parameter
types given.</p>

<p>This uses reflection to invoke the method obtained from a call to
<code>getAccessibleMethod()</code>.</p>

@param object invoke method on this object
@param methodName get method with this name
@param args use these arguments - treat null as empty array
@param parameterTypes match these parameters - treat null as empty array
@return The value returned by the invoked method

@throws NoSuchMethodException if there is no such accessible method
@throws InvocationTargetException wraps an exception thrown by the
 method invoked
@throws IllegalAccessException if the requested method is not accessible
 via reflection
android/android_framework/base/src/main/java/lang3/reflect/MethodUtils.java