code: @SuppressWarnings("unchecked")
    public static <E> E send(Object o, String methodName, Object... args) {
      try {
        for (Method method : o.getClass().getMethods()) {
          if (method.getName().equals(methodName)) {
            boolean isArgsMatched = true;
            for (int i = 0; i < method.getParameterTypes().length; i++) {
              if (i >= args.length || args[i] == null) continue;
  
              if (!isConvertable(method.getParameterTypes()[i],
                  args[i].getClass()))
                isArgsMatched = false;
            }
            if (isArgsMatched && method.getParameterTypes().length == args.length)
              return (E) method.invoke(o, args);
          }
        }
        throw new NoSuchMethodException();
      } catch (NoSuchMethodException e) {
        logger.log(Level.SEVERE, null, e);
        throw new IllegalArgumentException("NoMethodError: undefined method `"
            + methodName + "' for " + o + ":" + o.getClass().getName());
      } catch (Exception e) {
        logger.log(Level.SEVERE, null, e);
        throw new RuntimeException(e);
      }
    }
docs: Executes a method of any Object by Java reflection.
  
  @param o
  an Object
  @param methodName
  name of the method
  @param args
  arguments of the method
  @return the result of the method called