/** * 根据给定的一个方法,判断其是 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); }
/** * 迭代自己内部的所有的定时器配置信息,并检查其有效性 * * @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); } }