Существует ли более эффективный способ получить аннотируемый метод?

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

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

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

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

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

11
задан Kevin 10 February 2010 в 14:21
поделиться

3 ответа

Возможно, в пути к классам среды разработки имеется банка, но она необходима в пути к классам среды выполнения

-121--4667586-

Наиболее вероятная причина, по которой можно предположить, что разница между тегами < div > и < span > заключается в том, что элемент < div > считается элементом блока, а элемент < span > - встроенным.

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

<div class="row">
    <div style="float: left;">
        <span>Endzeit:</span>
    </div>
    <div style="float: left;">
        <input type="text" /> <span>10.2.2010</span>
    </div>
    <div id="EndTimeErrors">
        <label for="EndTime" class="field-validation-error">
                Bitte geben Sie eine gültige Uhrzeit ein, zum Beispiel 8:00 oder 14:34
         </label>
    </div>
</div>

Если нет, попробуйте его, и я думаю, что это может сработать.

-121--3926344-

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

Вот SSCCE , просто скопируйте 'n' paste 'n'.

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);
    }

}
12
ответ дан 3 December 2019 в 08:29
поделиться

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

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

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

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

Annotion[] annos = myMethod.getAnnotations();

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

1
ответ дан 3 December 2019 в 08:29
поделиться

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

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

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

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

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

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

1
ответ дан 3 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: