docs: public Object invokeBestMethodOnTarget( String[] methodNames,
                                              final Object target,
                                              final Object... arguments )
          throws NoSuchMethodException, SecurityException, IllegalArgumentException, IllegalAccessException,
          InvocationTargetException {
          Class<?>[] argumentClasses = buildArgumentClasses(arguments);
          int remaining = methodNames.length;
          Object result = null;
          for (String methodName : methodNames) {
              --remaining;
              try {
                  final Method method = findBestMethodWithSignature(methodName, argumentClasses);
                  result = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
                      @Override
                      public Object run() throws Exception {
                          return method.invoke(target, arguments);
                      }
                  });
                  break;
              } catch (PrivilegedActionException pae) {
                  // pae will be wrapping one of IllegalAccessException, IllegalArgumentException, InvocationTargetException
                  if (pae.getException() instanceof IllegalAccessException) {
                      throw (IllegalAccessException)pae.getException();
                  }
  
                  if (pae.getException() instanceof IllegalArgumentException) {
                      throw (IllegalArgumentException)pae.getException();
                  }
  
                  if (pae.getException() instanceof InvocationTargetException) {
                      throw (InvocationTargetException)pae.getException();
                  }
  
              } catch (NoSuchMethodException e) {
                  if (remaining == 0) throw e;
              }
          }
          return result;
      }