我很难弄清楚如何从其实际实现类中获得对java.lang.annation.annotation的引用。
注释本身看起来是这样的(从一个框架来看):
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
...snip...
}
在我的使用代码中,我想做这样的事情:
Annotation requiresPermissionAnnotation = RequiresPermissions.class;
在我的一生中,我都不知道该用什么或如何铸造它,或者我可以用什么打字来获得它
作为解决方案,我可以有一个简单的类,它有一个带有此注释的方法(以及其他方法),并在该类上使用反射方法来获得java.lang.annation.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;