Java 8, Google Reflections - Получить аннотированные типы в виде списка аннотаций, а не класса - PullRequest
1 голос
/ 23 марта 2020

StackOverflow-ERS! Я создаю игру, а именно Volts of Doom, в которой пользователи могут писать и помещать свои собственные моды в папку, которая затем будет загружена в игру (аналогично Minecraft Forge, за исключением того, что эта игра предназначена для модификации). .

Мод объявлен с аннотацией @Mod (см. Ниже). В настоящее время я могу найти файл jar в правильном каталоге / mods /, а затем найти классы, помеченные @Mod. Проблема возникает, когда я пытаюсь прочитать модид из аннотации @Mod классов.

Я использую Google Reflections, чей метод getTypesAnnotatedWith(Annotation.class) возвращает Set<Class<?>> аннотированных классов, но поскольку элементы имеют тип Class<?>, а не тип @Mod, я не могу получить доступ к этому необходимому значению.

Как я могу получить это значение, если все, что я получаю, это ошибки компилятора и ClassCastExceptions, когда я пытаюсь получить Модид или приведение класса к формату, из которого я могу получить доступ к модиду? Я понимаю, почему возникают исключения (не может привести суперкласс к подклассу и т. Д. c), но я не могу найти решение ... Любые идеи?

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

//Make the annotation available at runtime:
@Retention(RetentionPolicy.RUNTIME)

//Allow to use only on types:
@Target(ElementType.TYPE)

public @interface Mod {
    String modid();
}
Reflections reflections = new Reflections(new URLClassLoader("My Class Loader")), new SubTypesScanner(false), new TypeAnnotationsScanner());

Set<Class<?>> set = reflections.getTypesAnnotatedWith(Mod.class);

//cannot access modid from this set :(

1 Ответ

1 голос
/ 23 марта 2020
Set<Class<?>> set = reflections.getTypesAnnotatedWith(Mod.class);

возвращает вам типы, которые были аннотированы, если вы хотите sh проверить сами аннотации, вам нужно посмотреть на них тоже, например, следующим образом

for(Class<?> clazz : set) {
   Mod mod = clazz.getAnnotation(Mod.class);
   mod.modid();
}
...