public static Object callMethod(Object obj, String methodName, Class<?>[] parameterTypes, Object... args) {
        try {
            return findMethodBestMatch(obj.getClass(), methodName, parameterTypes, args).invoke(obj, args);
        } catch (IllegalAccessException e) {
            // should not happen
            XposedBridge.log(e);
            throw new IllegalAccessError(e.getMessage());
        } catch (IllegalArgumentException e) {
            throw e;
        } catch (InvocationTargetException e) {
            throw new InvocationTargetError(e.getCause());
        }
    }
Calls an instance or static method of the given object.
See {@link #callMethod(Object, String, Class[], Object...)}.

<p>This variant allows you to specify parameter types, which can help in case there are multiple
methods with the same name, especially if you call it with {@code null} parameters.
android/android_framework/base/src/main/java/util/XposedHelpers.java