Отражение Java: количество методов с аннотацией? - PullRequest
1 голос
/ 02 декабря 2009

Это отлично работает для фильтрации методов с аннотацией Analyze:

    for (Method m : ParseTree.class.getMethods()) {
        if (m.isAnnotationPresent(Analyze.class)) {

Что если я просто хочу посчитать, без циклического прохождения? Есть ли какой-нибудь метод, который возвращает количество методов в определенном классе с определенной аннотацией?

Ответы [ 2 ]

3 голосов
/ 02 декабря 2009

Это очень особый вариант использования, поэтому я действительно сомневаюсь, что в API отражения Java есть метод.

Но даже если бы существовал такой метод, он просто сделал бы то же самое: перебрал бы все методы класса, посчитал аннотации и сообщил число.

Я предлагаю вам просто реализовать статический метод в некотором служебном классе для этой задачи.

public static int countAnnotationsInClass(Class<?> testClass, Class<?> annotation) {
  // ...
}
1 голос
/ 02 декабря 2009

Java-аннотации с сохранением во время выполнения (то есть те, которые вы можете получить с помощью рефлексии) доступны только непосредственно из элемента, в котором присутствует аннотация. Так что вам придется пройтись по методам и проверить аннотации, которые есть в вашем примере.

Если вам нужно много обработать аннотации на уровне класса, я предлагаю вам создать служебный класс, который делает это:

public class AnnotationUtils {
    public static int countMethodsWithAnnotation(Class<?> klass,
                                                 Class<?> annotation) {
        int count = 0;
        for (Method m : klass.getMethods()) {
            if (m.isAnnotationPresent(annotation)) {
                count++;
            }
        }
        return count;
    }

    // Other methods for custom annotation processing

}

Затем вы можете использовать служебный класс для получения необходимой информации в одном вызове метода, как вам требуется в остальной части кода:

int count = AnnotationUtils.countMethodsWithAnnotation(ParseTree.class,
                                                       Analyze.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...