Я знаю, что мы можем получить все методы с определенной аннотацией внутри класса. Но мне нужны все методы внутри пакета с этой аннотацией. Мой вариант использования: я хочу аннотировать и идентифицировать несколько наборов методов и попросить моего пользователя выбрать один из них, добавленный в поток для выполнения.
@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 может быть плохой идеей загружать все классы из приложения - особенно если многие из них не используются, если некоторые функции не включены или зависят от системы и могут вызывать ошибку при загрузке. Но все же +1, так как это хороший шаг, на который OP должен попытаться найти ответ, прежде чем спрашивать.




Лучший способ - использовать Reflections (это имя этой библиотеки), это позволяет очень просто сканировать путь к классам для поиска классов или методов с заданными аннотациями.
Set<Method> methodsAnnotatedWith = new Reflections("my.package", new MethodAnnotationsScanner()).getMethodsAnnotatedWith(SomeAnnotation.class);
Если вы по какой-то причине хотите написать собственный, вам нужно получить путь к классам и URL-адреса от заданных загрузчиков классов, чтобы вручную сканировать файлы классов в заданном месте, чтобы загрузить их и проверить, предоставили ли они аннотации / методы. Эта библиотека также делает это без загрузки классов, которые вам не нужны, поскольку само сканирование не загружает классы, загружаются только классы, соответствующие вашему «запросу». (и он делает это, загружая файлы .class в собственные структуры данных)
Большое спасибо за ваше решение, сэр, но можем ли мы ограничить наш поиск также на основе аннотации переменных наизнанку? Как в аннотации Step с Type = "TRIGGER" и т. д. В этом случае.
@VivekKrishna: да, есть также методы, требующие getMethodsAnnotatedWith(Annotation annotation), но вам нужен экземпляр аннотации, но вы можете просто создать класс, реализующий данную аннотацию, как любой другой интерфейс, и использовать его в качестве этого шаблона поиска. Также существуют библиотеки, позволяющие создавать аннотации из карты значений и класса.
@VivekKrishna ах, но вы не можете фильтровать только по одному параметру аннотации, поэтому было бы лучше просто сделать это после этого глобального сканирования
вы уже знаете, как получить все методы с определенной аннотацией внутри класса. Узнайте, как получить все классы в пакете, а затем выполнить цикл.