test/java/lang/annotation/typeAnnotations/GetAnnotatedReceiverType.java
Print this page
rev 10097 : 8044629: (reflect) Constructor.getAnnotatedReceiverType() returns wrong value
Reviewed-by: duke
*** 1,7 ****
/*
! * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2013, 2014 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 21,34 ****
* questions.
*/
/*
* @test
! * @bug 8024915
*/
import java.lang.reflect.AnnotatedType;
import java.util.Arrays;
public class GetAnnotatedReceiverType {
public void method() {}
public void method0(GetAnnotatedReceiverType this) {}
--- 21,35 ----
* questions.
*/
/*
* @test
! * @bug 8024915 8044629
*/
import java.lang.reflect.AnnotatedType;
+ import java.lang.reflect.Executable;
import java.util.Arrays;
public class GetAnnotatedReceiverType {
public void method() {}
public void method0(GetAnnotatedReceiverType this) {}
*** 40,83 ****
class Inner1 {
public Inner1(GetAnnotatedReceiverType GetAnnotatedReceiverType.this) {}
}
private static int failures = 0;
private static int tests = 0;
public static void main(String[] args) throws NoSuchMethodException {
! checkEmptyAT(GetAnnotatedReceiverType.class.getMethod("method").getAnnotatedReceiverType(),
"getAnnotatedReceiverType for \"method\" should return an empty AnnotatedType");
! checkEmptyAT(Inner0.class.getConstructor(GetAnnotatedReceiverType.class).getAnnotatedReceiverType(),
"getAnnotatedReceiverType for a ctor without a \"this\" should return an empty AnnotatedType");
! checkEmptyAT(GetAnnotatedReceiverType.class.getMethod("method0").getAnnotatedReceiverType(),
"getAnnotatedReceiverType for \"method0\" should return an empty AnnotatedType");
! checkEmptyAT(Inner1.class.getConstructor(GetAnnotatedReceiverType.class).getAnnotatedReceiverType(),
"getAnnotatedReceiverType for a ctor with a \"this\" should return an empty AnnotatedType");
! checkNull(GetAnnotatedReceiverType.class.getMethod("method4").getAnnotatedReceiverType(),
"getAnnotatedReceiverType() on a static method should return null");
if (failures != 0)
throw new RuntimeException("Test failed, see log for details");
! else if (tests != 5)
throw new RuntimeException("Not all cases ran, failing");
}
! private static void checkNull(Object o, String msg) {
! if (o != null) {
failures++;
! System.err.println(msg);
}
tests++;
}
! private static void checkEmptyAT(AnnotatedType a, String msg) {
if (a.getAnnotations().length != 0) {
failures++;
! System.err.print(msg);
}
tests++;
}
}
--- 41,158 ----
class Inner1 {
public Inner1(GetAnnotatedReceiverType GetAnnotatedReceiverType.this) {}
}
+ public static class Nested {
+ public Nested() {}
+
+ public class NestedInner {
+ public NestedInner() { }
+
+ public Class<?> getLocalClass () {
+ class NestedInnerLocal { public NestedInnerLocal() {} }
+ return NestedInnerLocal.class;
+ }
+
+ public Class<?> getAnonymousClass() {
+ return new Object() {}.getClass();
+ }
+ }
+ }
+
+ public class Inner2 {
+ public Inner2() { }
+
+ public class Inner3 {
+ public Inner3() { }
+
+ public Class<?> getLocalClass () {
+ class InnerLocal { public InnerLocal() {} }
+ return InnerLocal.class;
+ }
+
+ public Class<?> getAnonymousClass() {
+ return new Object() {}.getClass();
+ }
+ }
+
+ public Class<?> getLocalClass () {
+ class InnerLocal { public InnerLocal() {} }
+ return InnerLocal.class;
+ }
+
+ public Class<?> getAnonymousClass() {
+ return new Object() {}.getClass();
+ }
+ }
+
private static int failures = 0;
private static int tests = 0;
public static void main(String[] args) throws NoSuchMethodException {
! checkEmptyAT(GetAnnotatedReceiverType.class.getMethod("method"),
"getAnnotatedReceiverType for \"method\" should return an empty AnnotatedType");
! checkEmptyAT(Inner0.class.getConstructor(GetAnnotatedReceiverType.class),
"getAnnotatedReceiverType for a ctor without a \"this\" should return an empty AnnotatedType");
! checkEmptyAT(GetAnnotatedReceiverType.class.getMethod("method0"),
"getAnnotatedReceiverType for \"method0\" should return an empty AnnotatedType");
! checkEmptyAT(Inner1.class.getConstructor(GetAnnotatedReceiverType.class),
"getAnnotatedReceiverType for a ctor with a \"this\" should return an empty AnnotatedType");
! checkNull(GetAnnotatedReceiverType.class.getMethod("method4"),
"getAnnotatedReceiverType() on a static method should return null");
+ // More nested, inner, local and anonymous classes
+ Nested nested = new Nested();
+ Nested.NestedInner instance = nested.new NestedInner();
+ checkNull(nested.getClass().getConstructors()[0],
+ "getAnnotatedReceiverType() on a constructor for a static class should return null");
+ checkEmptyAT(instance.getClass().getConstructors()[0],
+ "getAnnotatedReceiverType for a ctor without a \"this\" should return an empty AnnotatedType");
+ checkNull(instance.getLocalClass().getConstructors()[0],
+ "getAnnotatedReceiverType() on a constructor for a local class should return null");
+ checkNull(instance.getAnonymousClass().getDeclaredConstructors()[0],
+ "getAnnotatedReceiverType() on a constructor for an anonymous class should return null");
+
+ GetAnnotatedReceiverType outer = new GetAnnotatedReceiverType();
+ Inner2 instance2 = outer.new Inner2();
+ checkEmptyAT(instance2.getClass().getConstructors()[0],
+ "getAnnotatedReceiverType for a ctor without a \"this\" should return an empty AnnotatedType");
+ checkNull(instance2.getLocalClass().getConstructors()[0],
+ "getAnnotatedReceiverType() on a constructor for a local class should return null");
+ checkNull(instance2.getAnonymousClass().getDeclaredConstructors()[0],
+ "getAnnotatedReceiverType() on a constructor for an anonymous class should return null");
+
+ Inner2.Inner3 instance3 = instance2.new Inner3();
+ checkEmptyAT(instance3.getClass().getConstructors()[0],
+ "getAnnotatedReceiverType for a ctor without a \"this\" should return an empty AnnotatedType");
+ checkNull(instance3.getLocalClass().getConstructors()[0],
+ "getAnnotatedReceiverType() on a constructor for a local class should return null");
+ checkNull(instance3.getAnonymousClass().getDeclaredConstructors()[0],
+ "getAnnotatedReceiverType() on a constructor for an anonymous class should return null");
+
if (failures != 0)
throw new RuntimeException("Test failed, see log for details");
! else if (tests != 15)
throw new RuntimeException("Not all cases ran, failing");
}
! private static void checkNull(Executable e, String msg) {
! AnnotatedType a = e.getAnnotatedReceiverType();
! if (a != null) {
failures++;
! System.err.println(msg + ": " + e);
}
tests++;
}
! private static void checkEmptyAT(Executable e, String msg) {
! AnnotatedType a = e.getAnnotatedReceiverType();
if (a.getAnnotations().length != 0) {
failures++;
! System.err.print(msg + ": " + e);
}
tests++;
}
}