2011-09-16 23 views
33

Mientras navega por la documentación de la API Java 7 me topé con la nueva clase java.lang.ClassValue con la siguiente documentación más bien mínimas:ClassValue en Java 7

asocian Perezosamente un valor calculado con (potencialmente) cada tipo. Por ejemplo, si un lenguaje dinámico necesita construir una tabla de envío de mensajes para cada clase encontrada en un sitio de envío de mensajes, puede usar un ClassValue para almacenar en caché la información necesaria para enviar rápidamente el mensaje, para cada clase encontrada.

¿Alguien puede dar una mejor explicación de qué problema resuelve esta clase y tal vez algún ejemplo de código o proyecto de código abierto que ya utiliza esta clase?

Actualización: Todavía estoy interesado en algún código fuente real o ejemplos con esta nueva clase.

También encontré this mail on the mlvm-dev mailing list sobre algunas mejoras de implementación. Aparentemente se cambió de usar un WeakHashMap a un nuevo campo privado en java.lang.Class para hacerlo más escalable.

+0

Lectura de la API se ha vinculado a me sugiere que el método 'get()' es el mejor lugar para la pistas. No entiendo por qué el método 'get()' recibe un objeto 'Class', sin embargo. – Raedwald

+0

Actualmente hay un debate en la lista de distribución de core-libs (http://mail.openjdk.java.net/pipermail/mlvm-dev/2013-April/005321.html) sobre el uso de ClassValue en Groovy y sus interacciones con descarga de clases –

Respuesta

9

La mejor explicación del propósito de esta clase es que resuelve Java Bug 6389107

Hay muchos casos de uso cuando uno quiere tener esencialmente una Map<Class<?>, T> por alguna razón, pero esto provoca todo tipo de problemas desde Class objetos se entonces no se podrá GC hasta que el Mapa esté. WeakHashMap<Class<?>, T> no resuelve el problema porque con mucha frecuencia, T hace referencia a la clase.

El error anterior entra en una explicación mucho más detallada y contiene ejemplos de proyectos/códigos que enfrentan este problema.

ClassValue es la respuesta a este problema. Una herramienta de carga/descarga segura y segura para asociar datos con una clase.

6

Su propósito es permitir agregar información de tiempo de ejecución a clases de destino arbitrarias (reference).

Creo que está dirigido más a los programadores dinámicos de lenguaje. Sin embargo, no estoy seguro de cómo será útil para los desarrolladores de aplicaciones generales.

Inicialmente la clase estaba allí en el paquete java.dyn. This bug muestra que se mueve a java.lang.

1

Bueno, es una clase abstracta. Encontré un copy. Échale un vistazo.

+2

Aquí hay una copia [sintaxis resaltada] (http://code.google.com/p/jsr308-langtools/source/browse/src/share/classes/java/lang/ClassValue.java?repo=basic-jdk) . –

1

ClassValue cache algo sobre la clase. aquí es una parte de código (en Lucene 5.0 AttributeSource.java)

/** a cache that stores all interfaces for known implementation classes for performance (slow reflection) */ 
    private static final ClassValue<Class<? extends Attribute>[]> implInterfaces = new ClassValue<Class<? extends Attribute>[]>() { 
@Override 
protected Class<? extends Attribute>[] computeValue(Class<?> clazz) { 
    final Set<Class<? extends Attribute>> intfSet = new LinkedHashSet<>(); 
    // find all interfaces that this attribute instance implements 
    // and that extend the Attribute interface 
    do { 
    for (Class<?> curInterface : clazz.getInterfaces()) { 
     if (curInterface != Attribute.class && Attribute.class.isAssignableFrom(curInterface)) { 
     intfSet.add(curInterface.asSubclass(Attribute.class)); 
     } 
    } 
    clazz = clazz.getSuperclass(); 
    } while (clazz != null); 
    @SuppressWarnings({"unchecked", "rawtypes"}) final Class<? extends Attribute>[] a = 
     intfSet.toArray(new Class[intfSet.size()]); 
    return a; 
} 
};