按名称检索注释

时间:2019-05-12 08:59:46

标签: java reflection java-8 annotations

我知道可以通过使用名称来获得课程

public String className = "someName";
public Class<?> c = Class.forName(className);

是否可以通过名称检索注释?我尝试过:

public String annotationName = "someName";
public Class<?> c = Class.forName(annotationName);

然后将c强制转换为Class<? extends Annotation>,但可以,但是我得到了未经检查的强制转换警告。

我也尝试过

public String annotationName = "someName";
public Class<? extends Annotation> c = Class.forName(annotationName);

但是当我这样做时,我得到了错误

Incompatible types.
Required: Class<? extends java.lang.annotation.Annotation>
Found: Class<Capture<?>>

1 个答案:

答案 0 :(得分:3)

使用asSubclass。与编译器生成的类型转换(只能在编译时使用已知的类型)不同,这将对运行时检索到的Class对象进行检查。由于这是安全的,因此不会产生“未经检查的演员表”警告。请注意,存在用于铸造Class实例的类似操作cast。这些方法是在Java 5中添加的,专门用于使用泛型的代码。

String annotationName = "java.lang.Deprecated";
Class<? extends Annotation> c = Class.forName(annotationName).asSubclass(Annotation.class);
boolean depr = Thread.class.getMethod("stop").isAnnotationPresent(c);
System.out.println(depr);