Java - загрузка аннотированных классов
Я знаю, что есть невероятный набор инструментов для загрузки классов плагина в java, но сегодня идея пришла мне в голову.
Что делать, если у меня есть куча аннотированных и не аннотированных классов в пакете "org.home.junk" (аннотируется аннотацией "@AnnotatedClass" ), и эти классы имеют аннотированные методы с аннотацией "@AnnotatedMethod".
Первый вопрос: Могу ли я во время выполнения получить массив/коллекцию всех классов в этом конкретном пакете, чтобы я мог проверить, какой из них аннотирован, и создать экземпляр из них. (Я знаю, однако, как проверить, поддерживает ли Some.class аннотации этого руководства: http://isagoksu.com/2009/development/java/creating-custom-annotations-and-making-use-of-them/)
Второй вопрос:. Если я могу сделать то, что хотел бы в первом вопросе, - что было бы самым политическим способом сделать это?
Я считаю, что это возможно, так как я понимаю, что JUnit загружает классы тестовых случаев некоторым способом.
Также было бы здорово, если бы это можно было сделать с минимальными сторонними библиотеками и т.д., опять же - если это возможно:)
Ответы
Ответ 1
Первый ответ: Посмотрите этот проект.
Reflections reflections = new Reflections("org.home.junk");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class);
Он возвращает все классы из org.home.junk
, аннотированные аннотацией javax.persistence.Entity
.
Второй ответ: Чтобы создать новый экземпляр вышеуказанных классов, вы можете сделать это
for (Class<?> clazz : annotated) {
final Object newInstance = clazz.newInstance();
}
Надеюсь, это ответит на все.
Ответ 2
Это можно сделать с помощью техник, которые проверяют файловую систему, потому что это скорее проблема загрузчика классов, чем отражение. Проверьте это: Вы можете найти все классы в пакете, используя отражение?.
Если вы можете проверить все файлы классов, которые существуют в каталоге, вы можете легко получить соответствующий класс, используя этот метод
Class<?> klass = Class.forName(className)
Чтобы узнать, является ли класс аннотированным или нет, это проблема отражения. Получение аннотаций, используемых в классе, выполняется следующим образом:
Annotation[] annotations = klass.getAnnotations();
Обязательно укажите свою пользовательскую аннотацию с типом политики хранения, отображаемым во время выполнения.
@Retention(RetentionPolicy.RUNTIME)
Эта статья является хорошим ресурсом для получения дополнительной информации об этом: http://tutorials.jenkov.com/java-reflection/annotations.html.
Ответ 3
Если у вас есть Spring (сторонний, извините:-)), используйте org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider
Пример использования кода можно найти в этом вопросе SO
Ответ 4
Все зависит от того, какое требование у вас есть для аннотации.
Как, например, @EJB
: эта аннотация предназначена для того, чтобы контейнер идентифицировал и выполнял специальную работу EJB, которая требует сканирования через файлы, а затем поиска таких классов.
Однако, если ваше требование состоит только в том, чтобы включить определенные функции на основе аннотации, вы можете сделать это, используя только отражение java
например. @NotNull
: эта аннотация предназначена для JSR 303 для проверки того, что аннотированный элемент не является нулевым. Эта функциональность может быть легко реализована во время выполнения с использованием API отражения