示例#1
0
  /**
   * Invokes the underlying method represented by this {@code Method} object, on the specified
   * object with the specified parameters. Individual parameters are automatically unwrapped to
   * match primitive formal parameters, and both primitive and reference parameters are subject to
   * method invocation conversions as necessary.
   *
   * <p>If the underlying method is static, then the specified {@code obj} argument is ignored. It
   * may be null.
   *
   * <p>If the number of formal parameters required by the underlying method is 0, the supplied
   * {@code args} array may be of length 0 or null.
   *
   * <p>If the underlying method is an instance method, it is invoked using dynamic method lookup as
   * documented in The Java Language Specification, Second Edition, section 15.12.4.4; in
   * particular, overriding based on the runtime type of the target object will occur.
   *
   * <p>If the underlying method is static, the class that declared the method is initialized if it
   * has not already been initialized.
   *
   * <p>If the method completes normally, the value it returns is returned to the caller of invoke;
   * if the value has a primitive type, it is first appropriately wrapped in an object. However, if
   * the value has the type of an array of a primitive type, the elements of the array are
   * <i>not</i> wrapped in objects; in other words, an array of primitive type is returned. If the
   * underlying method return type is void, the invocation returns null.
   *
   * @param obj the object the underlying method is invoked from
   * @param args the arguments used for the method call
   * @return the result of dispatching the method represented by this object on {@code obj} with
   *     parameters {@code args}
   * @exception IllegalAccessException if this {@code Method} object is enforcing Java language
   *     access control and the underlying method is inaccessible.
   * @exception IllegalArgumentException if the method is an instance method and the specified
   *     object argument is not an instance of the class or interface declaring the underlying
   *     method (or of a subclass or implementor thereof); if the number of actual and formal
   *     parameters differ; if an unwrapping conversion for primitive arguments fails; or if, after
   *     possible unwrapping, a parameter value cannot be converted to the corresponding formal
   *     parameter type by a method invocation conversion.
   * @exception InvocationTargetException if the underlying method throws an exception.
   * @exception NullPointerException if the specified object is null and the method is an instance
   *     method.
   * @exception ExceptionInInitializerError if the initialization provoked by this method fails.
   */
  public Object invoke(Object obj, Object... args)
      throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    if (!override) {
      if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
        Class<?> caller = Reflection.getCallerClass(1);

        checkAccess(caller, clazz, obj, modifiers);
      }
    }
    MethodAccessor ma = methodAccessor; // read volatile
    if (ma == null) {
      ma = acquireMethodAccessor();
    }
    return ma.invoke(obj, args);
  }
示例#2
0
  private static void executeCommand(SkypeMessage chat, CommandData data, Matcher m) {
    if (data.getCommand().admin()) {
      try {
        if (!Arrays.asList(Resource.GROUP_ADMINS).contains(chat.getSender().getUsername())) {
          Resource.sendMessage(chat, "Access Denied!");
          return;
        }
      } catch (Exception ignored) {
        return;
      }
    }

    try {
      if (data.getCommand().cooldown() > 0
          && !Arrays.asList(Resource.GROUP_ADMINS).contains(chat.getSender().getUsername())) {
        if (!SkypeBot.getInstance().getCooldownHandler().canUse(data.getCommand())) {
          return;
        }
      }

      long difference = System.currentTimeMillis() - lastCommand;

      if (difference <= 5000L) {
        return;
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    List<Object> a = new ArrayList<>();
    a.add(chat);

    if (m.groupCount() > 0) {
      for (int i = 1; i <= m.groupCount(); i++) {
        String g = m.group(i);
        if (g.contains(".") && Utils.isDouble(g)) {
          a.add(Double.parseDouble(g));
        } else if (Utils.isInteger(g)) {
          a.add(Integer.parseInt(g));
        } else {
          a.add(g);
        }
      }
    }

    if (a.size() < data.getMethod().getParameterCount()) {
      for (int i = a.size(); i < data.getMethod().getParameterCount(); i++) {
        if (data.getMethod().getParameters()[i].getType().equals(String.class)) {
          a.add(null);
        } else {
          a.add(0);
        }
      }
    }

    MethodAccessor methodAccessor = null;
    try {
      Field methodAccessorField = Method.class.getDeclaredField("methodAccessor");
      methodAccessorField.setAccessible(true);
      methodAccessor = (MethodAccessor) methodAccessorField.get(data.getMethod());

      if (methodAccessor == null) {
        Method acquireMethodAccessorMethod =
            Method.class.getDeclaredMethod("acquireMethodAccessor", null);
        acquireMethodAccessorMethod.setAccessible(true);
        methodAccessor =
            (MethodAccessor) acquireMethodAccessorMethod.invoke(data.getMethod(), null);

        lastCommand = System.currentTimeMillis();
      }
    } catch (NoSuchFieldException
        | InvocationTargetException
        | IllegalAccessException
        | NoSuchMethodException e) {
      Resource.sendMessage(chat, "Failed... (" + ExceptionUtils.getStackTrace(e) + ")");
    }

    try {
      methodAccessor.invoke(null, a.toArray());
    } catch (Exception e) {
      Resource.sendMessage(
          chat, "Failed... (" + Utils.upload(ExceptionUtils.getStackTrace(e)) + ")");
    }
  }