我希望通过java反射获得一个类(在jar文件中打包)注释参数。
我这样的注释
@Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface TestPlugin {
public String moduleName();
public String plugVersion();
public String minLeapVersion();
}
我这样的课
@TestPlugin(moduleName="xxx", plugVersion="1.0.0", minLeapVersion="1.3.0")
public class Plugin {
......
}
我的访问代码如下
Class<?> clazz = this.loadClass(mainClassName); // myself classloader
Annotation[] annos = clazz.getAnnotations();
for (Annotation anno : annos) {
Class<? extends Annotation> annoClass = anno.annotationType();
/* Question is here
This code can get right annotationType: @TestPlugin.
Debug windows show anno is $Proxy33.
But I can't find any method to get annotation membervalues even though I can find them in debug windows.
How can I get annotation's parameters?
*/
}
答案 0 :(得分:1)
由于某些技术原因,Java VM使用的“真实”注释类是动态代理。这不应该打扰你。他们仍然“实现”你的注释类。只需使用
TestPlugin plugin = clazz.getAnnotation(TestPlugin.class);
plugin.getClass() == TestPlugin.class; // false - is Dynamic proxy
TestPlugin.class.isAssignableFrom(plugin.getClass()); // true - Dynamic proxy implements TestPlugin interface
编辑:刚刚在another answer中找到,您也可以在循环中询问您的anno
对象,但不要使用getClass()
。使用.annotationType()
。