Проверьте, требует ли метод параметр, используя аннотацию, и отразите - PullRequest
0 голосов
/ 10 мая 2018

Вопрос: есть ли способ выполнить проверку кода для метода и проверить, не имеет ли он параметра, и предупредить меня перед компиляцией или даже выдать предупреждение в моей 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 голосов
/ 15 мая 2018

Я написал основу для такого общего требования. См. 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

0 голосов
/ 10 мая 2018

method.getParameterTypes().length == 0 тогда и только тогда, когда method не имеет параметров. ( Javadoc )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...