Featured Post

Primeros pasos con Android (I). Entorno de desarrollo.

Vamos a ver que es Android y que debemos hacer para poder llegar a desarrollar una aplicación. Android es un sistema operativo basado en Linux y que cuenta con una interfaz de desarrollo Java. Android permite ejecutar procesos en segundo plano, soporta gráficos en 2D y 3D, ofrece una buena interfaz...

Read More

Reflection API (VI) – Tipos Genericos

Posted by Antonio Vidal | Posted in Java | Posted on 15-01-2012

Etiquetas: , ,

1

Los tipos genéricos fueron implementados como una transformación en tiempo de ejecución. Los tipos genéricos no permiten conocer en tiempo de ejecución el tipo con el que se ha parametrizado, es decir, en tiempo de ejecución no podemos distinguir si un atributo es Map o es Map. Cuando utilizamos tipos genéricos el compilador genera el mismo bytecode que cuando utilizamos tipos no genéricos, insertando en tiempo de ejecución el código necesarios para realizar un cast para convertirlos en el tipo apropiado en cada acceso. Debido a que el bytecode es idéntico, la información sobre el tipo del parámetro es almacenada en la clase mediante un nuevo atributo.

Mediante reflexión también seremos capaces de obtener en tiempo de ejecución información sobre tipos genéricos, tanto de atributos como parámetros devueltos por un método o parámetros pasados a un método.

Tipo Parámetro Atributos Genéricos

Para obtener el parámetro de un atributo de tipo genérico se utiliza el método Field.getGenericType().

Lo primero que hacemos es obtener el objeto Field asociado al atributo genérico. A continuación, obtenemos el tipo del atributo, el cual es de tipo Type (interfaz genérico para todos los tipos de Java). Este tipo es el genérico (java.util.List), mientras que nosotros queremos obtener el parámetro de la lista. Para poder obtenerlo, necesitamos hacer un cast de nuestro objeto Type a ParameterizedType (un subinterfaz específico de los tipos parametrizados). Por ultimo obtenemos un array de los tipos específicos mediante el método getActualTypeArguments().

Tipo Devuelto en un Método

Para conocer el parámetro del tipo que devuelve un método utilizaremos el método Method.getGenericReturnType().

Como se puede observar el código es similar al utilizado con los atributos, primero obtenemos el tipo del parámetro que deseamos obtener y a continuación obtenemos los parámetros.

Parámetros Genéricos de un Método

Para conocer el parámetro del tipo que devuelve un método utilizaremos el método Method.getGenericParameterTypes().

La única diferencia con los dos ejemplos vistos anteriormente es que la variable parameterTypes ahora se trata de un array de objetos Type, donde cada elemento de dicho array se corresponde con el tipo genérico del parámetro correspondiente en la función setListAmigos().