java java-8 receiver type-annotation

java - Cómo acceder a anotaciones de tipo en los parámetros de un tipo de receptor



java-8 receiver (3)

Estoy viendo una clase bastante trivial con un solo método que define un tipo de receptor anotado:

class Foo<T> { void foo(Foo<@Bar T> this) {} }

Ahora me gustaría acceder a la anotación de tipo en el parámetro @Bar del tipo de receptor, pero la API de reflexión de Java devuelve un tipo en bruto anotado al acceder al receptor:

assert Foo.class.getDeclaredMethod("foo") .getAnnotatedReceiverType() instanceof AnnotatedParameterizedType;

La aserción falla cuando el tipo anotado que se devuelve se devuelve como un tipo sin Foo . ¿Es esto intencional? Todavía puedo encontrar la anotación @Bar al acceder a las propiedades privadas de la implementación de AnnotatedType que se devuelve.

Estoy ejecutando una versión reciente de Java 8.


Este es un error conocido JDK-8058220 . Sin embargo, el problema es más profundo de lo que puede parecer.

No se puede arreglar fácilmente sin cambios en el formato de archivo de clase y las actualizaciones de especificación correspondientes. Actualmente, el archivo de clase no contiene la información necesaria para distinguir el parámetro del receptor de uno normal (consulte JDK-8062582 ).


Resulta que esto es un error simple. Primero pensé, esto es una implicación de los problemas vinculados, pero las anotaciones de tipo no tienen nada que ver con eso. Las anotaciones de tipo están mal probadas en la implementación actual del tiempo de ejecución de Java. Encontré una gran cantidad de problemas cuando me sumergí en el tema:


Si ejecuto esto:

Foo<Integer> f = new Foo<>(); Method m = f.getClass().getDeclaredMethod("foo"); AnnotatedType at = m.getAnnotatedReceiverType(); for (Annotation a:at.getAnnotations()) { System.out.println("Annotation: "+a); }

Luego puse la anotación en el tipo de receptor así:

public void foo(@Bar(1) Foo<T> this) {}

Ahora puedes acceder a la anotación @Bar (1). Tenga en cuenta que coloco la anotación directamente en el parámetro ReceiverParameter, no el tipo de parámetro que desee.

Sé que esto es solo una respuesta parcial en este momento ... pero quería comenzar en algún lugar. Otros pueden agregar y proporcionar una respuesta completa, o aprenderé un poco más a medida que pase el tiempo ... Los Tipos de Receptores y el uso de las anotaciones son muy nuevos para mí, y no hay mucha documentación ni ejemplos que contar.

Mi sospecha es que simplemente no hay manera de acceder a esta información. Ver también la respuesta y otro tema :

En cuanto a los comentarios, sobre cómo obtener la anotación de un argumento de tipo en un parámetro de método, no hay forma dada lo anterior.

El mismo tema le mostrará cómo acceder a las anotaciones en los argumentos de tipo en un campo.