如何从jar文件中的类中获取注释参数

时间:2017-01-16 12:29:03

标签: java jar annotations

我希望通过java反射获得一个类(在jar文件中打包)注释参数。

  1. 我这样的注释

    @Documented
    @Retention(RUNTIME)
    @Target(TYPE)    
    public @interface TestPlugin {
        public String moduleName();
        public String plugVersion();
        public String minLeapVersion();    
    }
    
  2. 我这样的课

    @TestPlugin(moduleName="xxx", plugVersion="1.0.0", minLeapVersion="1.3.0")
    
    public class Plugin {
    
      ......
    
    }
    
  3. 我的访问代码如下

    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?
        */
    }
    

    Debug windows info

1 个答案:

答案 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()