Подтвердить что ты не робот

Java - загрузка аннотированных классов

Я знаю, что есть невероятный набор инструментов для загрузки классов плагина в java, но сегодня идея пришла мне в голову.

Что делать, если у меня есть куча аннотированных и не аннотированных классов в пакете "org.home.junk" (аннотируется аннотацией "@AnnotatedClass" ), и эти классы имеют аннотированные методы с аннотацией "@AnnotatedMethod".

Первый вопрос: Могу ли я во время выполнения получить массив/коллекцию всех классов в этом конкретном пакете, чтобы я мог проверить, какой из них аннотирован, и создать экземпляр из них. (Я знаю, однако, как проверить, поддерживает ли Some.class аннотации этого руководства: http://isagoksu.com/2009/development/java/creating-custom-annotations-and-making-use-of-them/)

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

Я считаю, что это возможно, так как я понимаю, что JUnit загружает классы тестовых случаев некоторым способом.

Также было бы здорово, если бы это можно было сделать с минимальными сторонними библиотеками и т.д., опять же - если это возможно:)

4b9b3361

Ответ 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.

Ответ 4

Все зависит от того, какое требование у вас есть для аннотации.

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

Однако, если ваше требование состоит только в том, чтобы включить определенные функции на основе аннотации, вы можете сделать это, используя только отражение java

например. @NotNull: эта аннотация предназначена для JSR 303 для проверки того, что аннотированный элемент не является нулевым. Эта функциональность может быть легко реализована во время выполнения с использованием API отражения