una - static int java
¿Es posible la metaprogramación estática en Java? (9)
No, los genéricos en Java son puramente una forma de evitar el lanzamiento de Object.
Soy un fan de la metaprogramación estática en C ++ . Sé que Java ahora tiene genéricos. ¿Esto significa que la metaprogramación estática (es decir, la ejecución del programa en tiempo de compilación) es posible en Java? Si es así, ¿alguien puede recomendar algún buen recurso donde se pueda obtener más información al respecto?
No. Aún más, los tipos genéricos se borran a su límite superior por el compilador, por lo que no puede crear una nueva instancia de un tipo genérico T en tiempo de ejecución.
La mejor manera de hacer metaprogramming en Java es eludir el borrado de tipo y la mano en el objeto Class<T>
de su tipo T. Sin embargo, esto es solo un hack.
Eche un vistazo a Clojure . Es un LISP con Macros (meta-programación) que se ejecuta en la JVM y es muy interoperable con Java.
En un sentido muy reducido, tal vez? http://michid.wordpress.com/2008/08/13/type-safe-builder-pattern-in-java/
No estoy seguro de entender la ventaja de la meta-programación estática.
En Java, puede reflexionar para encontrar información sobre sus clases y hacer todo lo que haría la meta-programación, solo tiene que hacerlas dentro de su código sin agregar nueva sintaxis y diferentes formas de pensar. Las anotaciones también pueden realizar ciertas tareas de metaprogramación de una manera más estructurada.
Podría estar equivocado al respecto, estoy considerando seriamente abrir una pregunta porque no estoy seguro de entenderlo. Parece que la meta-programación estática es un truco perfecto que evita el hecho de que algunos lenguajes no mantienen una gran cantidad de información en tiempo de compilación disponible en tiempo de ejecución (uno de los puntos fuertes de Java y de los lenguajes dinámicos).
Si alguien pudiera responder con un enlace a un ejemplo donde la meta-programación ofrece una solución más comprensible, legible o mejor que la reflexión, agradecería el esfuerzo.
Si necesita una poderosa lógica en tiempo de compilación para Java, una forma de hacerlo es con algún tipo de generación de código. Dado que, como han señalado otros carteles, el lenguaje Java no proporciona ninguna característica adecuada para hacer lógica en tiempo de compilación, esta puede ser su mejor opción (si realmente necesita una lógica en tiempo de compilación). Una vez que haya agotado las otras posibilidades y esté seguro de que desea generar código, es posible que le interese mi proyecto de código abierto Rjava, disponible en:
http://www.github.com/blak3mill3r
Es una biblioteca de generación de código Java escrita en Ruby, que escribí para generar automáticamente las interfaces de Google Web Toolkit para las aplicaciones de Ruby on Rails. Ha resultado bastante útil para eso.
Como advertencia, puede ser muy difícil depurar el código de Rjava, Rjava no hace demasiadas comprobaciones, solo asume que sabes lo que estás haciendo. Eso es más o menos el estado de metaprogramación estática de todos modos. Diría que es mucho más fácil de depurar que cualquier cosa no trivial con C ++ TMP, y es posible usarlo para el mismo tipo de cosas.
De todos modos, si estaba considerando escribir un programa que emite el código fuente de Java, deténgase ahora y vea Rjava. Puede que aún no haga lo que usted desea, pero tiene licencia MIT, así que siéntase libre de mejorarlo, freírlo o vendérselo a su abuela. Me gustaría que otros desarrolladores con experiencia en programación genérica comenten sobre el diseño.
¿Qué quiere decir exactamente con "metaprogramación estática"? Sí, la metaprogramación de plantillas C ++ es imposible en Java, pero ofrece otros métodos, mucho más potentes que los de C ++:
- reflexión
- programación orientada a aspectos (@AspectJ)
- manipulación de bytecode (Javassist, ObjectWeb ASM, agentes de Java)
- generación de código (Herramienta de procesamiento de anotaciones, motores de plantillas como Velocity)
- Manipulaciones abstractas del árbol de sintaxis (API proporcionadas por IDEs populares)
- posibilidad de ejecutar el compilador de Java y usar código compilado incluso en tiempo de ejecución
No existe el mejor método: cada uno de esos métodos tiene sus fortalezas y debilidades. Debido a la flexibilidad de JVM, todos estos métodos en Java se pueden usar tanto en tiempo de compilación como en tiempo de ejecución.
Lombok ofrece una forma débil de metaprogramación de tiempo de compilación. Sin embargo, la técnica que utilizan es completamente general .
Vea la transformación del código de Java en tiempo de compilación para una discusión relacionada
No, esto no es posible Los genéricos no son tan poderosos como las plantillas. Por ejemplo, un argumento de plantilla puede ser un tipo definido por el usuario, un tipo primitivo o un valor; pero un argumento de plantilla genérico solo puede ser un Object
o un subtipo del mismo.
Editar: esta es una respuesta antigua; desde 2011 tenemos Java 7, que tiene anotaciones que se pueden utilizar para tales trucos .