Cara mendapatkan parameter anotasi dari kelas dalam file jar

Saya ingin mendapatkan parameter anotasi kelas (dikemas dalam file jar) dengan Java Reflect.

  1. Penjelasan saya seperti ini

    @Documented
    @Retention(RUNTIME)
    @Target(TYPE)    
    public @interface TestPlugin {
        public String moduleName();
        public String plugVersion();
        public String minLeapVersion();    
    }
    
  2. Kelasku seperti ini

    @TestPlugin(moduleName="xxx", plugVersion="1.0.0", minLeapVersion="1.3.0")
    
    public class Plugin {
    
      ......
    
    }
    
  3. Kode akses saya seperti ini

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

    Info debug jendela


person Robbie    schedule 16.01.2017    source sumber
comment
Jendela debug dapat ditemukan pada gambar terlampir   -  person Robbie    schedule 16.01.2017


Jawaban (1)


Kelas anotasi "sebenarnya" yang digunakan oleh Java VM adalah Proksi Dinamis karena beberapa alasan teknis. Ini seharusnya tidak mengganggu Anda. Mereka masih "menerapkan" kelas anotasi Anda. Gunakan saja

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

EDIT: Baru saja ditemukan di jawaban lain, bahwa Anda juga dapat menanyakan objek anno di loop Anda, tetapi jangan gunakan getClass(). Gunakan .annotationType().

person Florian Albrecht    schedule 16.01.2017