RFR: 8202471: Make type annotations on owner type parameters available [v4]

Joel Borggrén-Franck jfranck at openjdk.java.net
Sun Nov 15 19:55:58 UTC 2020


On Sat, 31 Oct 2020 21:11:15 GMT, Rafael Winterhalter <winterhalter at openjdk.org> wrote:

>> A method's or constructor's owner type might carry annotations on its potential type parameters but is never represented as parameterized type what makes these parameters inaccessible at runtime, despite the presence of parameter type annotations.
>
> Rafael Winterhalter has refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR.

Hi Rafael,

Thanks for your patience and  for the patch, I left a few comments.

src/java.base/share/classes/java/lang/reflect/Constructor.java line 664:

> 662:         Type t;
> 663:         if (o != null || v.length > 0) {
> 664:             t = ParameterizedTypeImpl.make(enclosingClass, v, o);

I think these should be instantiated by a GenericsFactory. Ideally you shouldn't have to import the reflective object directly.

src/java.base/share/classes/java/lang/reflect/Constructor.java line 660:

> 658:         }
> 659: 
> 660:         TypeVariable<?>[] v = enclosingClass.getTypeParameters();

Can you push down most or all of this to resolveOwner? It can then either return a Class instance or an appropriate Type instance.

src/java.base/share/classes/java/lang/reflect/Executable.java line 699:

> 697:         }
> 698:         Class<?> c = getDeclaringClass();
> 699:         TypeVariable<?>[] v = c.getTypeParameters();

Same here, can this be pushed down to a common method that either returns a Class or resolves the appropriate Type instance?

test/jdk/java/lang/annotation/typeAnnotations/TestReceiverTypeParameterizedConstructor.java line 52:

> 50:         Inner(TestReceiverTypeParameterizedConstructor<@TypeAnnotation T> TestReceiverTypeParameterizedConstructor.this) { }
> 51:     }
> 52: 

It might be good to add a case where the annotated type variable isn't on the immediate outer type like:

    class Inner2 {
        class  TwiceInner {
            TwiceInner(TestReceiverTypeParameterizedConstructor<@TypeAnnotation T>.Inner2 TestReceiverTypeParameterizedConstructor.Inner2.this) { }
        }
    }

Same for the method test.

-------------

PR: https://git.openjdk.java.net/jdk/pull/851


More information about the core-libs-dev mailing list