我知道可以通过使用名称来获得课程
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<?>>
答案 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);