JDK-7086192 : (reflect) Have TypeVariable extend AnnotatedElement
  • Type: Enhancement
  • Component: core-libs
  • Sub-Component: java.lang:reflect
  • Affected Version: 8
  • Priority: P4
  • Status: Closed
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2011-09-02
  • Updated: 2017-05-16
  • Resolved: 2012-05-09
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8
8 b06Fixed
Related Reports
Relates :  
Relates :  
Description
When annotations were added to the platform by JSR 175 in JDK 5, annotations could *not* be applied to the declarations of type parameters of classes, methods, and constructors.

For regularity of the language model and core reflections and to support forthcoming functionality expected in JSR 308, it would be helpful if java.lang.reflect.TypeVariable extended AnnotatedElement even if the implementation was only vacuous.

Comments
PUBLIC COMMENTS See http://hg.openjdk.java.net/jdk8/tl/jdk/rev/fa1e7738a136
07-09-2011

SUGGESTED FIX # HG changeset patch # User darcy # Date 1315369171 25200 # Node ID fa1e7738a136b454b2e52d02b02ae524bd3e04ed # Parent c62794c9caea936f4d216c494221649a6cfe873d 7086192: (reflect) Have TypeVariable extend AnnotatedElement Reviewed-by: mcimadamore --- a/src/share/classes/java/lang/reflect/TypeVariable.java Wed Sep 07 08:56:55 2011 +0800 +++ b/src/share/classes/java/lang/reflect/TypeVariable.java Tue Sep 06 21:19:31 2011 -0700 @@ -48,7 +48,7 @@ package java.lang.reflect; * * @since 1.5 */ -public interface TypeVariable<D extends GenericDeclaration> extends Type { +public interface TypeVariable<D extends GenericDeclaration> extends Type, AnnotatedElement { /** * Returns an array of {@code Type} objects representing the * upper bound(s) of this type variable. Note that if no upper bound is --- a/src/share/classes/sun/reflect/generics/reflectiveObjects/TypeVariableImpl.java Wed Sep 07 08:56:55 2011 +0800 +++ b/src/share/classes/sun/reflect/generics/reflectiveObjects/TypeVariableImpl.java Tue Sep 06 21:19:31 2011 -0700 @@ -25,9 +25,11 @@ package sun.reflect.generics.reflectiveObjects; +import java.lang.annotation.Annotation; import java.lang.reflect.GenericDeclaration; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; +import java.util.Objects; import sun.reflect.generics.factory.GenericsFactory; import sun.reflect.generics.tree.FieldTypeSignature; @@ -178,4 +180,27 @@ public class TypeVariableImpl<D extends public int hashCode() { return genericDeclaration.hashCode() ^ name.hashCode(); } + + // Currently vacuous implementations of AnnotatedElement methods. + public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) { + Objects.requireNonNull(annotationClass); + return false; + } + + public <T extends Annotation> T getAnnotation(Class<T> annotationClass) { + Objects.requireNonNull(annotationClass); + return null; + } + + public Annotation[] getAnnotations() { + // Since zero-length, don't need defensive clone + return EMPTY_ANNOTATION_ARRAY; + } + + public Annotation[] getDeclaredAnnotations() { + // Since zero-length, don't need defensive clone + return EMPTY_ANNOTATION_ARRAY; + } + + private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0]; } --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/lang/reflect/TypeVariable/TestAnnotatedElement.java Tue Sep 06 21:19:31 2011 -0700 @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2011, 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. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7086192 + * @summary Verify functionality of AnnotatedElement methods on type variables + * @author Joseph D. Darcy + */ + +import java.lang.reflect.*; +import java.lang.annotation.*; + +public class TestAnnotatedElement<A> { + // Type variable on a method + private static <B> B m(B b) {return null;} + + // Type variable on a construtor + private <C> TestAnnotatedElement(){super();} + + public static void main(String... argv) throws ReflectiveOperationException { + int errors = 0; + + Class<?> clazz = TestAnnotatedElement.class; + errors += testTypeVariable(clazz.getTypeParameters()); + errors += testTypeVariable(clazz.getDeclaredConstructor().getTypeParameters()); + errors += testTypeVariable(clazz.getDeclaredMethod("m", Object.class).getTypeParameters()); + + if (errors > 0) + throw new RuntimeException(errors + " failures"); + } + + + private static int testTypeVariable(TypeVariable<?>[] typeVars) { + int errors = 0; + if (typeVars.length == 0) + return ++errors; + + for(TypeVariable<?> typeVar : typeVars) { + try { + typeVar.getAnnotation(null); + errors++; + } catch(NullPointerException npe) { + ; // Expected + } + + if (typeVar.getAnnotation(SuppressWarnings.class) != null) + errors++; + + try { + typeVar.isAnnotationPresent(null); + errors++; + } catch(NullPointerException npe) { + ; // Expected + } + + if (typeVar.isAnnotationPresent(SuppressWarnings.class)) + errors++; + + if(typeVar.getAnnotations().length != 0) + errors++; + + if(typeVar.getDeclaredAnnotations().length != 0) + errors++; + } + return errors; + } +}
07-09-2011

EVALUATION A fine idea.
02-09-2011