views:

372

answers:

1

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 ?

+5  A: 

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

@Retention(RUNTIME) @interface Annotate {}

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

abyx
Thanks a bunch !
subtenante
May I ask, though, if you happen to know whether there is a way to change the default behaviour of CLASS retention policy to RUNTIME ?
subtenante
As far as I know that's not possible, but I may be wrong.
abyx
Only by recompiling the annotation. If it's not your annotation, no.
EJP