Method.getAnnotations() method giving different ou

2019-08-08 20:11发布

I am getting different output for the same code while using java 1.7.0_79 and 1.7.0_80 versions for compilation and running. The test code snippet looks like this :

interface Constraint<T> extends Serializable {

    T getValue();
}


@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@interface NonZero {


}

public class ReflectionTest {

    @SuppressWarnings("serial")
    public static void main(String[] args) {

        Constraint<Integer> c = new Constraint<Integer>() {

            @Override
            @NonZero
            public Integer getValue() {
                return null;
            }
        };

        for(Method m : c.getClass().getDeclaredMethods()) {
            System.out.println("Method :: " + m.toGenericString());

            if(m.getAnnotations().length == 0){
                System.out.println("No annotations detected");
            } else {
                for(Annotation o: m.getAnnotations()) {
                    System.out.println("Annotation :: " + o);
                }
            }
        }
    }
}

The output for java 1.7.0_79 is :

Method :: public java.lang.Integer ReflectionTest$1.getValue()
Annotation :: @NonZero() 
Method :: public java.lang.Object
ReflectionTest$1.getValue() No annotations detected

And the output for 1.7.0_80 is :

Method :: public java.lang.Integer ReflectionTest$1.getValue()
Annotation :: @NonZero()
Method :: public java.lang.Object ReflectionTest$1.getValue()
Annotation :: @NonZero()

In the code compiled with jdk-1.7.0_80 version, annotation is applied to the parent method while this was not the case in the earlier versions. Why is this difference?

0条回答
登录 后发表回答