crear clase con anotaciones en tiempo ejecucion

es posible que cuando haga un executequery los resultados que me traiga esa consulta me crear una clase a partir de ese query que segun los nombres de las columnas me creee los atributos de la clase.
y a la vez pueda añadirle anotaciones

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Si es posible crear clases con anotaciones en tiempo de ejecució

Lo que mencionas acerca de las clases si es posible crearlas con los campos de las columnas y esas cosas. El problema es las anotaciones no son mágicas (como lo hacen pensar por ejemplo Spring o Hibernate), estos frameworks leen todas esas anotaciones cuando se inicia la aplicación (se levanta el contexto), aunque sean anotaciones del framework X, tendrás que registrarlas para que puedan funcionar como una clase creada en tiempo de compilación.

Seria bueno que te echaras un clavado sobre AOP, aspectos e instrumentación.

Si, necesitas una herramienta

Si, necesitas una herramienta de manipulacion de bytecode como Javassist (http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/)

Que vas a hacer luego con esas anotaciones y esos atributos? Supongo que tendras algún código que los lea, pero ese código ya tiene las propiedades o también se crearía dinámicamente?

nada queria probar

queria probar que segun mi query si me trae 3 columnas crear una clase segun esas caracteristicas
que si me trae un query 10 columnas crear un clase con esos 10 atributos y asi pensando en obviarme la construccion de clase
manual sino que fuera automatica

Imagen de ezamudio

cglib

Creo que ya desde hace tiempo recomendaban no usar javassist porque no ha sido actualizado en un buen rato; cglib es la otra opción, un poco más complicada de usar pero bastante efectiva.

Y no es más fácil usar simples mapas en vez de estar creando clases al vuelo? Suponiendo que hagas la clase sólo en tiempo de ejecución, y por lo tanto no existe en tu base de código... cómo puedes hacer referencia a ella?

No estás complicando las cosas de manera innecesaria? Porque digo, no le encuentro mucho sentido a tener que escribir todo un mecanismo para poder crear una clase al vuelo usando cglib o alguna otra cosa medio esotérica, que va a resultar en bastante código, para evitar la flojera de tener que escribir una clase con 3 atributos... en todo caso escribe esas clases en Groovy para que no tengas que hacer getter y setter, o usa Lombok para que nada más le pongas la anotación @Data o le pongas a cada propiedad @Getter y @Setter...

ezamudio

suena interesante lo de escribir las clase en groovy tienes un ejemplo concreto eso de sin getter y setter suena bien

Imagen de ezamudio

facil

class Ejemplo {
  String nombre
  Date nacimiento
  BigDecimal saldo
}

O con lombok en Java:

public class Ejemplo {
  @Getter @Setter private String nombre;
  @Getter @Setter private Date nacimiento;
}

ok

mirando groovy parece magico puede tener todas mi modelo beans daos y tdo ese cuento con groovy????

lombok

eso solo es con java 8???

O con atributos publicos.

O con atributos publicos.

public class Ejemplo {
   public String nombre;
   public Date nacimiento;
   public BigDecimal saldo;
}

Aunque es una mala práctica porque se viola el encapsulamiento y puede tener problemas para la herencia. Nunca he hecho esto, ni lo haré, pero siempre me he preguntado porque no se aplica más seguido. La razón principal es al tener bibliotecas compartidas, si se intenta darle funcionalidad al agregar un valor ( un setter pues ) el usar ahora el método ( algo.setNumbre() ) provoca que tengas que recompilar tu applicacion, pero si tienes bien claro que jamás lo harás, es una opción ( de otra forma Java prohibiría el uso de public en los atributos )

no me quedo claro

de crear maps vs clases al vuelo lo unico que quiero es que mi sql se parseen con una clase java unica que se construye segun el query
no entiedo como hacerlo con maps?

ese groovy es genial

esa es toda mi clase en java era un monton de codigo esto de la simplicidad que trae groovy es genial... sigo leyendo y comentando

@ EqualsAndHashCode
clase Task {
String nombre
int prioridad
Fecha startDate
Fecha endDate
String toString () {" ($ name , $ prioridad , $ startDate , $ endDate ) "}
}

Imagen de Cid

Mejores practicas

Hola porque manejar las anotaciones de @Getter y @Setter con lombok no es adecuado antes de declarar la clase y se tienen que hacer en la declaración de cada variable.