Мне сложно провести время, пытаясь понять, как получить ссылку на java.lang.annotation.Annotation из своего реального класса реализации.
Сама аннотация выглядит так (из фреймворка):
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
...snip...
}
В моем использовании кода я хотел бы сделать что-то вроде этого:
Annotation requiresPermissionAnnotation = RequiresPermissions.class;
Я не могу, для жизни меня, выяснить, что или как это сделать, или то, что я набираю, чтобы получить его.
Как работа вокруг, я мог бы иметь простой класс, который имеет метод с этой аннотацией (и другими), и использовать методы отражения в классе, чтобы получить java.lang.annotation.Annotation, но это просто кажется странным.
Благодарю!
Экземпляр аннотации существует только для аннотированного типа/метода. Вот как вы можете это получить
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);
Скажите, что у вас есть класс MyClass
, который аннотированный с RequiresPermissions
аннотацией:
@RequiresPermissions("something")
public class MyClass {
// ...
}
Если вы хотите увидеть значения аннотации для MyClass
в своей программе, вы можете сделать это:
RequiresPermissions anno = MyClass.class.getAnnotation(RequiresPermissions.class);
System.out.println(anno.value());
(Я не знаю, каких атрибутов вашой RequiresPermissions
аннотации есть, вы можете вызвать их на anno
объекте, чтобы получить значение).
Свойство .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;
RequiresPermissions r = someAnnotatedClass.getAnnotation(RequiresPermissions.class)
. Проще, и не нужен актерский состав.