Получить все методы с определенной аннотацией в пакете

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

@Retention(RetentionPolicy.RUNTIME)
@Target({ METHOD })
public @interface Step {
    String Type();// default "Trigger";
    String SubType();
    String [] tags();
}

public interface APITrigger {

    @Step(Type = "TRIGGER", SubType = "GET_CLASS_INSTANCE", tags = { "trigger", "build instance", "class object" })
    public Object getClassInstance(@NonNull final String packageNclassName)
            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, NoSuchFieldException;

    @Step(Type = "TRIGGER", SubType = "INVOKE_API_N_RETURN", tags = { "trigger", "hit api", "trigger api and return" })
    public Map<Class<?>, Object> invokeOveloadedAPINReturn(@NonNull final Object classInstance,
            @NonNull final String methodName);
}
public interface Comparator {

    @Step(Type = "COMPARATOR", SubType = "GENERIC_COMPARATOR", tags = { "compare", "expected", "observed", "any type", "generic comparator" })
    public <T> ComparisonResult Compare(T Expected, T Observed);

}

Мне нужен список методов [getclassinstance, invokeOveloadedAPINReturn, Compare], поскольку эти три аннотированы Step. Можем ли мы сделать это с помощью отражения? Кроме того, можем ли мы ограничить наш поиск переменными внутри аннотации?

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

jhamon 09.08.2018 11:34

@jhamon может быть плохой идеей загружать все классы из приложения - особенно если многие из них не используются, если некоторые функции не включены или зависят от системы и могут вызывать ошибку при загрузке. Но все же +1, так как это хороший шаг, на который OP должен попытаться найти ответ, прежде чем спрашивать.

GotoFinal 09.08.2018 12:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
3 964
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучший способ - использовать Reflections (это имя этой библиотеки), это позволяет очень просто сканировать путь к классам для поиска классов или методов с заданными аннотациями.

Set<Method> methodsAnnotatedWith = new Reflections("my.package", new MethodAnnotationsScanner()).getMethodsAnnotatedWith(SomeAnnotation.class);

Если вы по какой-то причине хотите написать собственный, вам нужно получить путь к классам и URL-адреса от заданных загрузчиков классов, чтобы вручную сканировать файлы классов в заданном месте, чтобы загрузить их и проверить, предоставили ли они аннотации / методы. Эта библиотека также делает это без загрузки классов, которые вам не нужны, поскольку само сканирование не загружает классы, загружаются только классы, соответствующие вашему «запросу». (и он делает это, загружая файлы .class в собственные структуры данных)

Большое спасибо за ваше решение, сэр, но можем ли мы ограничить наш поиск также на основе аннотации переменных наизнанку? Как в аннотации Step с Type = "TRIGGER" и т. д. В этом случае.

Vivek Krishna 09.08.2018 13:08

@VivekKrishna: да, есть также методы, требующие getMethodsAnnotatedWith(Annotation annotation), но вам нужен экземпляр аннотации, но вы можете просто создать класс, реализующий данную аннотацию, как любой другой интерфейс, и использовать его в качестве этого шаблона поиска. Также существуют библиотеки, позволяющие создавать аннотации из карты значений и класса.

GotoFinal 09.08.2018 14:22

@VivekKrishna ах, но вы не можете фильтровать только по одному параметру аннотации, поэтому было бы лучше просто сделать это после этого глобального сканирования

GotoFinal 09.08.2018 14:38

Другие вопросы по теме