ссылка на java.lang.annotation.Annotation из класса?

1

Мне сложно провести время, пытаясь понять, как получить ссылку на java.lang.annotation.Annotation из своего реального класса реализации.

Сама аннотация выглядит так (из фреймворка):

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
    ...snip...
}

В моем использовании кода я хотел бы сделать что-то вроде этого:

Annotation requiresPermissionAnnotation = RequiresPermissions.class;

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

Как работа вокруг, я мог бы иметь простой класс, который имеет метод с этой аннотацией (и другими), и использовать методы отражения в классе, чтобы получить java.lang.annotation.Annotation, но это просто кажется странным.

Благодарю!

Теги:
reflection
annotations

3 ответа

1
Лучший ответ

Экземпляр аннотации существует только для аннотированного типа/метода. Вот как вы можете это получить

Annotation requiresPermissionAnnotation = SomeAnnotatedClass.class.getAnnotation(RequiresPermissions.class);

Вы можете использовать для RequiresPermissions для доступа к любым атрибутам.

RequiresPermissions requiresPermissions = (RequiresPermissions) requiresPermissionAnnotation;

или получить его напрямую

RequiresPermissions requiresPermissions = SomeAnnotatedClass.class.getAnnotation(RequiresPermissions.class);

Для метода

Annotation requiresPermissionAnnotation = someMethodInstance.getAnnotation(RequiresPermissions.class);
  • 0
    Вы можете просто сделать RequiresPermissions r = someAnnotatedClass.getAnnotation(RequiresPermissions.class) . Проще, и не нужен актерский состав.
  • 0
    @Jesper Абсолютно. Просто придерживаюсь их фрагмента.
Показать ещё 1 комментарий
1

Скажите, что у вас есть класс MyClass, который аннотированный с RequiresPermissions аннотацией:

@RequiresPermissions("something")
public class MyClass {
    // ...
}

Если вы хотите увидеть значения аннотации для MyClass в своей программе, вы можете сделать это:

RequiresPermissions anno = MyClass.class.getAnnotation(RequiresPermissions.class);

System.out.println(anno.value());

(Я не знаю, каких атрибутов вашой RequiresPermissions аннотации есть, вы можете вызвать их на anno объекте, чтобы получить значение).

1

Свойство .class возвращает объект Class, который вы должны назначить любому супертипу Class. Это не экземпляр аннотации, поэтому попытка присвоить его Annotation не будет работать. Чтобы сохранить ссылку на тип аннотации, у вас есть несколько вариантов:

// use the actual class
Class<MyAnnotation> annotationClass1 = MyAnnotation.class;

// use a bounded wildcard
Class<? extends Annotation> annotationClass2 = (Class<? extends Annotation>) MyAnnotation.class;

// use an unbound wildcard, not recommended
Class<?> annotationClass3 = MyAnnotation.class;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню