2011-01-27 15 views
10

Cómo crear una java.util.ArrayList con la clase genérica utilizando la reflexión? Estoy escribiendo un método que establece java.util.List en el objeto de destino. Un objeto de destino y un tipo genérico de la lista es saber en tiempo de ejecución:Cómo crear una java.util.ArrayList con clase genérica utilizando la reflexión

public static void initializeList(Object targetObject, PropertyDescriptor prop, String gtype) { 
    try { 
     Class clazz = Class.forName("java.util.ArrayList<"+gtype+">"); 
     Object newInstance = clazz.newInstance(); 
     prop.getWriteMethod().invoke(targetObject, newInstance); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Respuesta

13

un objeto no saber acerca de su tipo genérico en tiempo de ejecución. Simplemente cree una nueva instancia del tipo sin procesar (java.util.ArrayList). El objeto de destino no sabrá la diferencia (porque allí no es ninguna diferencia).

Básicamente, los genéricos de Java son un truco en tiempo de compilación, con metadatos en las clases compiladas pero solo lanzando en tiempo de ejecución. Consulte el Java generics FAQ para obtener más información.

+0

sólo para no crear respuestas duplicadas, utilizando la reflexión es igual que hacer 'new ArrayList ()' debido a una "clase genérica" ​​se interpreta como un 'Object' en tiempo de ejecución –

2

Los genéricos son solo un "truco" en tiempo de compilación.

La reflexión es solo de tiempo de ejecución.

Básicamente, no puede - solo puede crear un "ArrayList" en bruto. Si necesita pasarlo a métodos que toman parámetros genéricos, lanzarlo directamente después de la construcción será seguro (independientemente de la advertencia "no seleccionada"). En este ejemplo, no hay seguridad de tipo de tiempo de compilación de todos modos debido al uso general Objects, por lo que no se necesita conversión.

+0

genéricos no es completamente un tiempo de compilación único. Los parámetros de tipo concreto en las definiciones de campo, método y clase están realmente presentes en el bytecode y se pueden adquirir en tiempo de ejecución a través de la reflexión. –

0

Los genéricos solo funcionan en tiempo de compilación, por lo tanto, si está utilizando el reflejo, no estarán disponibles.

Lea más acerca de esto here.

0

Un objeto no conoce su tipo genérico en el momento de la ejecución. Simplemente cree una nueva instancia del tipo sin formato (java.util.ArrayList). El objeto objetivo no sabrá la diferencia (porque no hay ninguna diferencia).

0

genéricos es en gran medida una función de tiempo de compilación. Lo que estamos tratando de hacer es lo mismo que

public static void initializeList(Object targetObject, PropertyDescriptor prop, String gtype) { 
    prop.getWriteMethod().invoke(targetObject, new ArrayList()); 
} 

Nota: Esto podría cambiar con tipos en Java 7.

6

No hay necesidad de hacer ninguna reflexión para la creación de su lista. Simplemente ingrese información de tipo adicional (por lo general, haciendo pasar una clase del tipo correcto).

public static <T> List<T> createListOfType(Class<T> type) { 
    return new ArrayList<T>(); 
} 

Ahora usted tiene una lista del tipo requerido se puede suponer que/es de esperar configurarlo directamente en su targetObject sin ninguna reflexión.

+0

Gracias. su trabajo para mi –

Cuestiones relacionadas