Есть ли более эффективный способ получить аннотированный метод? - PullRequest
11 голосов
/ 10 февраля 2010

Я запустил проект с открытым исходным кодом «для развлечения, никто не знает, никого не волнует» ( LinkSet ).

В одном месте мне нужно получить аннотированный метод класса.

Есть ли более эффективный способ сделать это, чем этот? Я имею в виду без необходимости повторения каждого метода?

for (final Method method : cls.getDeclaredMethods()) {

    final HandlerMethod handler = method.getAnnotation(HandlerMethod.class);
        if (handler != null) {
                return method;
          }
        }

Ответы [ 3 ]

12 голосов
/ 10 февраля 2010

Обратите внимание на Reflections (зависимости: Гуава и Javassist ). Это библиотека, которая уже оптимизировала большую часть всего этого. Существует Reflections#getMethodsAnnotatedWith(), который соответствует вашим функциональным требованиям.

Вот SSCCE , просто скопируйте и вставьте его.

package com.stackoverflow;

import java.lang.reflect.Method;
import java.util.Set;

import org.reflections.Reflections;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;

public class Test {

    @Deprecated
    public static void main(String[] args) {
        Reflections reflections = new Reflections(new ConfigurationBuilder()
            .setUrls(ClasspathHelper.forPackage("com.stackoverflow"))
            .setScanners(new MethodAnnotationsScanner()));
        Set<Method> methods = reflections.getMethodsAnnotatedWith(Deprecated.class);
        System.out.println(methods);
    }

}
1 голос
/ 10 февраля 2010

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

Чтобы ответить на ваш вопрос:

Class<?> _class = Whatever.class;
Annotation[] annos = _class.getAnnotations();

вернет все аннотации класса. То, что вы сделали, вернет только самую первую аннотацию метода. Как мудрый:

Annotion[] annos = myMethod.getAnnotations();

возвращает все аннотации данного метода.

1 голос
/ 10 февраля 2010

Нет. Но это совсем не неэффективно.

Например, пружина использует следующий код:

public static <A extends Annotation> A getAnnotation(
        Method method, Class<A> annotationType) {

    return BridgeMethodResolver.
       findBridgedMethod(method).getAnnotation(annotationType);
}

(где BridgedMethodResolver - другая тема, но она просто возвращает Method объект)

Кроме того, вместо сравнения с null, вы можете проверить, присутствует ли аннотация с isAnnotationPresent(YourAnnotation.class) (как это предлагается в комментариях под вопросом)

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