RFR: 8202471: (ann) Cannot read type annotations on generic receiver type's type variables [v4]
Rafael Winterhalter
winterhalter at openjdk.java.net
Sun Nov 15 23:17:30 UTC 2020
On Sun, 15 Nov 2020 19:49:57 GMT, Joel Borggrén-Franck <jfranck at openjdk.org> wrote:
>> 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. The pull request contains one new commit since the last revision:
>>
>> 8202471: 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.
>
> 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.
I added two tests for it.
> 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?
I moved it to an annotation factory class and avoided the import.
> 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.
Pushed it down to the factory.
> 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.
I added it to the existing generics factory but as a static method since the instance values are not really required.
-------------
PR: https://git.openjdk.java.net/jdk/pull/851
More information about the core-libs-dev
mailing list