Pregunta

soy un fan de metaprogramación estática en C++.Sé que Java ahora tiene genéricos.¿Significa esto que la metaprogramación estática (es decir, la ejecución de programas en tiempo de compilación) es posible en Java?Si es así, ¿alguien puede recomendar algún buen recurso donde se pueda aprender más al respecto?

¿Fue útil?

Solución

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 sólo puede ser Object o un subtipo del mismo.

Editar:Esta es una vieja respuesta;desde 2011 tenemos Java 7, que tiene Anotaciones que se pueden utilizar para tales engaños..

Otros consejos

Echa un vistazo a Clojure.Es un LISP con Macros (metaprogramación) que se ejecuta en JVM y es muy interoperable con Java.

¿Qué quiere decir exactamente con "metaprogramación estática"?Sí, la metaprogramación de plantillas de 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 código de bytes (Javassist, ObjectWeb ASM, agentes Java)
  • generación de código (Herramienta de procesamiento de anotaciones, motores de plantillas como Velocity)
  • Manipulaciones del árbol de sintaxis abstracta (API proporcionadas por IDE populares)
  • Posibilidad de ejecutar el compilador Java y utilizar 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 esos métodos en Java se pueden usar tanto en tiempo de compilación como en tiempo de ejecución.

No.Aún más, el compilador borra los tipos genéricos hasta su límite superior, por lo que no se puede crear una nueva instancia de un tipo genérico T en tiempo de ejecución.

La mejor manera de realizar metaprogramación en Java es evitar el borrado de tipos y entregar el Class<T> objeto de su tipo T.Aún así, esto es sólo un truco.

No, los genéricos en Java son simplemente una forma de evitar la conversión de objetos.

Si necesita una lógica poderosa 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 realizar lógica en tiempo de compilación, esta puede ser su mejor opción (si realmente necesita lógica en tiempo de compilación).Una vez que hayas agotado las otras posibilidades y estés seguro Si 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 interfaces de Google Web Toolkit para aplicaciones Ruby on Rails.Ha resultado bastante útil para eso.

Como advertencia, puede ser muy difícil depurar el código de Rjava, Rjava no realiza muchas comprobaciones, simplemente supone que sabes lo que estás haciendo.De todos modos, ese es más o menos el estado de la metaprogramación estática.Yo diría que es mucho más fácil de depurar que cualquier cosa no trivial hecha con C++ TMP, y es posible usarlo para el mismo tipo de cosas.

De todos modos, si estaba considerando escribir un programa que genere código fuente Java, deténgase ahora y consulte Rjava.Puede que todavía no haga lo que quieres, pero tiene licencia del MIT, así que siéntete libre de mejorarlo, freírlo o vendérselo a tu abuela.Me encantaría contar con otros desarrolladores con experiencia en programación genérica para comentar sobre el diseño.

lombok ofrece una forma débil de metaprogramación en tiempo de compilación.Sin embargo, la técnica que utilizan es completamente generales.

Ver Transformación de código Java en tiempo de compilación para una discusión relacionada

No estoy seguro de entender la ventaja de la metaprogramación estática.

En Java, puedes reflexionar para encontrar información sobre tus clases y hacer todas las cosas que haría la metaprogramación, solo puedes hacerlas dentro de tu código sin agregar nueva sintaxis ni 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 en esto, estoy considerando seriamente abrir una pregunta al respecto porque no estoy seguro de haberlo entendido.Parece que la metaprogramación estática es un truco ingenioso que evita el hecho de que algunos lenguajes no mantienen mucha información de 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 en el que la metaprogramación ofrezca una solución más comprensible, legible o mejor que la reflexión, agradecería el esfuerzo.

El proyecto múltiple ofrece tipo seguro estático Metaprogramación para Java.Puede usarlo para crear tipos dinámicamente en tiempo de compilación mientras Javac resuelve los nombres de los tipos.El Demostración del esquema JSON demuestra la metaprogramación estática en términos de proyección dinámica de tipo en tiempo de compilación (sin pasos de compilación de generación de código).

Además, puede utilizar Manifold para agregar nuevas funciones.Verificar Tipificación estructural, Extensiones de métodos, y Reflexión de tipo seguro. .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top