2011-05-27 13 views
6

Después de echar un vistazo en el Java VM specification, noté que se podía usar mucho más que solo letras ASCII para crear un identificador.Verdaderos genéricos de java (plantillas)

En primer lugar, me preguntaba si había alguna símbolos adicionales (aparte de $, que están disponibles para los identificadores)

¿Cree que sería posible, con el juego de caracteres extendidos para codificar información adicional en un identificador y un cargador de clases personalizado para implementar verdaderos genéricos de Java?

Por supuesto, tendría que evitar el borrado de tipos, pero eso podría ser posible con un analizador personalizado.

Por lo que podría almacenar nombres genéricos en un formato como: $g$GenericList$_Java_lang_String$

estoy usando GenericList aquí como no tengo la intención de modificar la implementación original!

Colóquelos con el cargador de clases, cree una versión adecuada GenericList<String> y envíela de regreso.

EDITAR: Planeo usar esto para un idioma que estoy construyendo en la JVM. Como utiliza $ y _ como caracteres especiales, ¡la información de codificación podría funcionar!

EDIT 2: Supongo que lo más difícil de hacer serían los métodos genéricos? ¿Alguien tiene información sobre cómo se implementarían?

EDIT 3: Dado que las clases solo se pueden descargar cuando el cargador de clases desaparece, ¿podría caché y eliminar plantillas resueltas, como funciona en .Net, o lo haría como C++?

+1

+1, idea interesante. Asegúrese de echar un vistazo a .NET IL, que utiliza un concepto similar para implementar genéricos sin borrado de tipo (en este caso, el carácter '(retroceso) se utiliza para delimitar parámetros genéricos en identificadores). –

+0

En realidad he estado buscando en Rotor (SSCIL), muy muy interesante. Mi problema es más cómo implementaría el almacenamiento en caché y el tiempo de vida de cada identidad genérica – Darkzaelus

Respuesta

2

La JVM permite todos los caracteres en los nombres de clase/campo/método excepto / y ; que tienen un significado especial. Usar números y otro carácter es común para los ofuscadores para dificultar la compilación.

Sin embargo, puede utilizar $ y _ para generar clases/campos/métodos.

Nota: se supone que JDK 7 tiene mejor soporte genérico con el Type con una combinación de clase y genéricos.

EDIT:

Una manera de tener tipo genérico adecuado es utilizar siempre

Set<String> set = new LinkedHashSet<String>() { }; 

El uso de { } crea una clase anónima que tiene un tipo genérico de los padres con el que desea. Puede obtener esta información a través de la reflexión.

Puede almacenar en caché y eliminar clases teniendo su propio cargador de clases del que dispone como lo desee. El caso más extremo sería tener un ClassLoader por clase.

Una vez que tenga sus propios tipos genéricos, puede usarlos en sus métodos, como los tipos normales.

+1

Muy interesante ... ¡abre una buena gama de posibilidades! Lamentablemente, no puedo confiar en que los clientes tengan Java 7, así que tengo que trabajar con lo que tengo para ser – Darkzaelus

+0

¡Muy interesante en el frente '{}'! ¿Sabes si es posible mover clases entre cargadores de clases? – Darkzaelus

+0

¿Hay un problema con esto? ¿Seguiría funcionando el chequeo? – Darkzaelus

0

Como puede usar Unicode, básicamente puede usar todo menos las pocas letras mencionadas en la respuesta anterior (/ ,;). No hay como "genéricos verdaderos" por cierto ... Sé lo que quieres decir; D y eso se llama "Plantillas".

+0

¡Es terrible, lo sé, estaba pensando que podría ser posible hacer una solución básica! – Darkzaelus

0

Sí, puede usar cualquier carácter Unicode como nombre de identificador en java. Consulte here para conocer los nombres de identificación permitidos en Java. Pero como se mencionó en la respuesta anterior, te refieres a "plantillas" para "verdaderos genéricos".