reflexion reflect method example ejemplos java reflection

method - reflection java stack overflow



ParameterizedType.getRawType() devuelve jlrType, no Class<?>? (4)

ParameterizedType parameterized = (ParameterizedType) List.class.getMethod("iterator").getGenericReturnType(); Type raw = parameterized.getRawType();

ParameterizedType#getRawType() devuelve un Type , no una Class<?> (Aunque obtengo que java.lang.Class ahora implementa el Type ). ¿Hay una buena razón por la que getRawType() no declara que su tipo de devolución sea Class<?> ? ¿Hay casos extremos en los que el resultado de getRawType() no sea una Class<?> ?

Es suficiente de una paliza para trabajar con jlrType como es; Esto parece una instancia en la que podrían habernos ahorrado un golpe bajo.


Debe devolver un objeto de Class , no hay otra manera.

¿Por qué? Quién sabe, tal vez un sesgo idealista. Si devolviera Class , sería la única apariencia de Class en las nuevas interfaces de Type .

El verdadero problema es la mezcla de Class y Type . Anteriormente, todos los tipos están representados en la Class . Ya estaba desordenado, pero aún así tolerable. No había muchos tipos.

Con los nuevos tipos genéricos, deberían haber diseñado una jerarquía de tipos más limpia y fiel a las especificaciones, independiente de la Class . En su lugar, incorporaron Class con Type y crearon más desorden. La jerarquía entera simplemente no tiene sentido. Cualquier persona nueva en el tema e inconsciente de la historia quedará consternada por esta tontería.

No sostendría el diseño de Type a un alto nivel. Por ejemplo, ParameterizedType define equals() , pero no hashCode() . No hay manera de que dos implementaciones de ParameterizedType funcionen en un mapa hash. ¿Y el comodín es también un tipo? Infierno no

Y el nombre del método getRawType() es simplemente idiota. No tiene nada que ver con raw type . Debe llamarse claramente getClassOrInterface() . ¿Sería demasiado verboso? Mira getActualTypeArguments() entonces. (Y sí, ¡devuelve argumentos reales ! ¡No falsos!)


Estaba pensando en esto, y tengo una corazonada. Tal vez quisieron dejar la posibilidad abierta para futuras locuras como esta:

public class Z<L extends List<?>> { L<Double> test; }

Este no es un código Java legal, pero creo que está claro lo que significaría; new Z<ArrayList<?>>().test sería de tipo ArrayList<Double> .

Si esto fuera legal, ((ParameterizedType) test.getGenericType()).getRawType() devolvería una TypeVariable .


Hay otros usos para la jerarquía de interfaz de tipo que no sean solo la api de reflexión. Por ejemplo, una biblioteca de generación de código puede definir implementaciones personalizadas. El JDK 8 en sí tiene 3 implementaciones diferentes de WildcardType. Si ParameterizedType.getRawType () devolvió una instancia de Class, entonces debería poder crear una instancia de Class cuando lo desee.

Una clase es un tipo muy arraigado en la JVM que tiene enlaces a la memoria administrada de forma nativa. Para crear una instancia de clase, debe tener el código de byte que define la clase. Pero en el caso de una biblioteca de generación de código, el código de bytes aún no existe. Si hubieran requerido que el tipo de parámetro parametrizado devolviera una clase, limitaría la aplicabilidad de la jerarquía de interfaz de tipo solo a la api de reflexión.

Esto puede no parecer un gran problema, pero tampoco es un elenco.

ParameterizedType.getOwnerType () devuelve un Tipo, ya que puede ser una Clase u otro ParameterizedType. En teoría, puede devolver una TypeVariable, ya que lo siguiente es Java válido:

<M extends Map<?,?>> M.Entry<?,?> first(M map) { ... }

Sin embargo, se compila como una referencia estática al borrado de la variable de tipo, en este caso M.Entry se compilaría como Map.Entry. En lugar de una TypeVariable, una llamada a getOwnerType () desde la API de reflexión será una Clase, al menos según mis pruebas.


La implementación de Sun de ParameterizedType ha definido el método getRawType() para devolver Class<?> . Entonces claramente devuelve solo Class<?>

Sin embargo, en mi ruta de clase hay algunas implementaciones más de ParameterizedType - desde hibernate-validator, desde aspectj, hibernate-anotaciones, jaxb. Algunos de ellos devuelven Class<?> , Algunos - Type . Aunque no sé cómo se usan.