检查方法是否需要使用注释的参数并反映

时间:2018-05-10 20:27:48

标签: java reflection annotations

问题:是否有办法对方法进行代码检查并检查它是否没有参数并在编译前发出警告,甚至在我的IDE中给出警告。

假设我有一个注释@Initialize

@Retention(RetentionPolicy.RUNTIME)
public @interface Initialize {
    int priority();
}

通过反射,我可以调用使用@Initialize

注释的方法
public static void initMethods(Initializable clazz) {
    TreeMap<Integer, Method> methods = prioritizedMethods(clazz.getClass().getDeclaredMethods());
    methods.forEach((priority, method) -> {
        try {
            method.setAccessible(true);
            Logger.debug("Invoking " + method.getName() + "...");
            method.invoke(clazz);
        } catch (IllegalAccessException | InvocationTargetException e) {
            Logger.debug("Failed to invoke " + method.getName());
            e.printStackTrace();
        }
    });
}

prioritzedMethods(Method[] method)是我检查注释的地方。

private static TreeMap<Integer, Method> prioritizedMethods(Method[] methods) {
    HashMap<Integer, Method> taggedMethods = new HashMap<>();
    for (Method method : methods) {
        if (method.isAnnotationPresent(Initialize.class)) {
            Initialize meta = method.getAnnotation(Initialize.class);
            taggedMethods.put(meta.priority(), method);
        }
    }
    return new TreeMap<>(taggedMethods);
}

我想确保所有使用@Initialize注释的方法都没有任何参数。

2 个答案:

答案 0 :(得分:2)

method.getParameterTypes().length == 0当且仅当method没有参数时。 (Javadoc

答案 1 :(得分:2)

我已经为这样的共同要求编写了一个框架。请参阅deannotation-checker

您唯一应该做的就是在注释上添加@CheckMethod

@CheckMethod(argCount = 0, returnType = @CheckType(void.class))
public @interface Init {
   ...
}

现在,您的注释能够限制带注释的方法。如果您使用它

@Init
public void func(int i) {
  ...
}

您将收到编译错误

[5,15] Must only have 0 arguments.

如果你支持IDE(我正在使用eclipse和m2e-apt插件),你可以在保存文件时收到错误。

enter image description here