2012-05-24 14 views

Respuesta

20

genéricos son borrados en tiempo de compilación, que sólo proporcionan información adicional para el compilador para determinar errores. En realidad, no cambian la firma del método en el archivo .class.

Esto significa que llama a un método genérico por reflexión en Java exactamente de la misma manera que llamaría a un método no genérico en Java, excepto que en lugar de especificar un tipo de T, especificaría un tipo de Object.

Hay tantos tutoriales sobre cómo llamar a un método normal por reflexión que dudo en agregar otro; sin embargo, si realmente necesita instrucciones sobre cómo llamar a un método por reflexión, agregue un comentario a continuación y agregaré el código necesario.

Si encuentra que las cosas no funcionan como se esperaba, siempre puede ejecutar javap en el archivo de clase compilado para verificar que está utilizando los objetos correctos en la lista de argumentos. Es posible que si especifica una firma genérica de tipo <T extends List>, el objeto de parámetro resultante podría ser realmente un objeto List.

10

Esto funciona para mí.

Method method = Person.class.getMethod("print", Object.class); 

method.invoke(new Person(), "this is a string"); 
method.invoke(new Person(), 273); 
method.invoke(new Person(), new Object()); 

la impresión

this is a string 
273 
[email protected] 

Por supuesto, la teoría detrás de esto se explica muy bien en @Edwin's answer.

4

Para resaltar el punto dado en la respuesta de Edwin, donde estamos utilizando se extiende en un tipo genérico: si usted tiene una clase como

GenericHibernateDao<T extends Serializable> 

, y un método

public T save(T entity) {}; 

para invocar el Método de guardar usando el reflejo tiene que usar la clase Serializable, es decir, necesita usar:

Method method = GenericHibernateDao.class.getMethod(methodName, Serializable.class); 

yn ot el Object.class como el parámetro, ya que estamos usando

<T extends Serializable> 
Cuestiones relacionadas