Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: cannot access annotations through reflection

Here is a test class:

import java.lang.annotation.Annotation; import java.lang.reflect.Method;  public class TestAnnotations {      @interface Annotate{}      @Annotate public void myMethod(){}      public static void main(String[] args) {         try{             Method[] methods = TestAnnotations.class.getDeclaredMethods();             Method m = methods[1];             assert m.getName().equals("myMethod");              System.out.println("method inspected ? " + m.getName());             Annotation a = m.getAnnotation(Annotate.class);             System.out.println("annotation ? " + a);             System.out.println("annotations length ? "                 + m.getDeclaredAnnotations().length);         }         catch(Exception e){             e.printStackTrace();         }     } } 

Here is my output :

method inspected ? myMethod annotation : null annotations length : 0 

What I am missing to make annotations visible through reflection ?
Do I need an annotation processor even for just checking their presence ?

like image 991
glmxndr Avatar asked Feb 18 '10 07:02

glmxndr


1 Answers

In order to access an annotation at runtime, it needs to have a Retention policy of Runtime.

@Retention(RetentionPolicy.RUNTIME) @interface Annotate {} 

Otherwise, the annotations are dropped and the JVM is not aware of them.
For more information, see here.

like image 149
abyx Avatar answered Oct 14 '22 03:10

abyx