Example #1
0
  /**
   * 根据给定的一个方法,判断其是 Getter 还是 Setter
   *
   * <p>对于回调会接受三个参数
   *
   * <pre>
   * callback(虚字段名, getter, setter)
   * </pre>
   *
   * 回调都会给一个参数,表示这个方法对应的虚拟字段名。所谓"虚拟字段",就比如
   *
   * <ul>
   *   <li>如果是 setAbc : 那么就是 "abc"
   *   <li>如果是 getAbc : 那么就是 "abc"
   *   <li>如果是 isAbc : 那么就是 "abc"
   * </ul>
   *
   * 而 getter 或者 setter 参数如果为 null,则表示本函数未发现对应的 getter|setter
   *
   * @param method 方法对象
   * @param callback 回调, 如果为 null,则无视
   * @param whenError 如果本方法即不是 Getter 也不是 Setter 的回调, 如果为 null,则无视
   */
  public static void evalGetterSetter(
      Method method, Callback3<String, Method, Method> callback, Callback<Method> whenError) {
    String name = method.getName();
    Method getter = null;
    Method setter = null;

    // 是 getter
    if (name.startsWith("get") && method.getParameterTypes().length == 0) {
      name = Strings.lowerFirst(name.substring(4));
      getter = method;
      // 寻找 setter
      try {
        setter =
            method
                .getDeclaringClass()
                .getMethod("set" + Strings.capitalize(name), method.getReturnType());
      } catch (Exception e) {
      }

    }
    // 布尔的 getter
    else if (name.startsWith("is")
        && Mirror.me(method.getReturnType()).isBoolean()
        && method.getParameterTypes().length == 0) {
      name = Strings.lowerFirst(name.substring(3));
      getter = method;
      // 寻找 setter
      try {
        setter =
            method
                .getDeclaringClass()
                .getMethod("set" + Strings.capitalize(name), method.getReturnType());
      } catch (Exception e) {
      }
    }
    // 是 setter
    else if (name.startsWith("set") && method.getParameterTypes().length == 1) {
      name = Strings.lowerFirst(name.substring(4));
      setter = method;
      // 寻找 getter
      try {
        getter = method.getDeclaringClass().getMethod("get" + Strings.capitalize(name));
      } catch (Exception e) {
      }

    }
    // 虾米都不是,错!
    else {
      if (null != whenError) whenError.invoke(method);
      return;
    }
    // 最后调用回调
    if (null != callback) callback.invoke(name, getter, setter);
  }
Example #2
0
  /**
   * 迭代自己内部的所有的定时器配置信息,并检查其有效性
   *
   * @param ioc Ioc 容器用来检查 TimerHander 名称的有效性
   * @param callback 回调用来后续处理
   */
  public void eachTimer(Ioc ioc, Callback3<Integer, Quartz, String[]> callback) {
    if (null == timers || timers.length == 0) return;

    for (int i = 0; i < timers.length; i++) {
      String timer = timers[i];
      String[] ss = Strings.splitIgnoreBlank(timer, "::");

      if (ss.length != 2) continue;

      // 检查 Quartz 表达式
      Quartz qz = Quartz.NEW(ss[0]);

      // 检查 handler
      String[] handlerNames = Strings.splitIgnoreBlank(ss[1], ",");
      for (String handlerName : handlerNames) ioc.get(TimerHandler.class, handlerName);

      // 调用回调
      if (callback != null) callback.invoke(i, qz, handlerNames);
    }
  }