Foros del Web » Programación para mayores de 30 ;) » Java »

Problemas con Reflection al usar herencias

Estas en el tema de Problemas con Reflection al usar herencias en el foro de Java en Foros del Web. Hola a todos, espero que estén bien, tengo una consulta para hacer y es que estoy automatizando las altas y bajas, de hecho funcionan sólo ...
  #1 (permalink)  
Antiguo 01/02/2017, 20:02
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Problemas con Reflection al usar herencias

Hola a todos, espero que estén bien, tengo una consulta para hacer y es que estoy automatizando las altas y bajas, de hecho funcionan sólo que no andan con las herencias:

ParamBuilder.java

Código Java:
Ver original
  1. private LinkedList<Object>loadMethods(IPersistente ip) throws Exception{
  2.         LinkedList<Method> m = new LinkedList();
  3. // mi problema está en el getDeclaredMethods() que lo uso para que me obtenga los get de la clase creada pero no los de la superclase.  
  4.        for(Method campo : ip.getClass().getDeclaredMethods()){
  5.             if (campo.getName().startsWith("get") && !campo.getName().startsWith("getClass")) {
  6.                 Method metodo = campo;
  7.                 if(metodo.getParameterCount() == 0) {
  8.                     if(metodo.isAnnotationPresent(Sort.class)){
  9.                         m.add(metodo);
  10.                     }
  11.                 }
  12.             }            
  13.         }
  14.         if(ip instanceof IDependiente && !ip.check()){
  15.             Collections.sort(m, new SortDesc());
  16.         } else {
  17.             Collections.sort(m, new SortAsc());
  18.         }
  19.         return load(ip, m);
  20.     }

En UsuarioModel traté de usar casting pero no funcionó, y así tengo el save del mismo:

Código Java:
Ver original
  1. @Override
  2.     public void save(IPersistente row) throws Exception {
  3.         if(row.getId() == 0){
  4.             System.out.println(this.sp.insert());
  5. // No me obtiene los get de la clase usuario, intenté usar downcasting pero no funcionó.
  6.             this.sp.getBD().conmand(this.sp.insert(), this.pm.getParam(row));
  7.             row.setId(this.maxId());
  8.         } else {
  9.             System.out.println(this.sp.update());
  10.             this.sp.getBD().conmand(this.sp.update(), this.pm.getParam(row));
  11.         }        
  12.         if(row instanceof Comprador){
  13.             Comprador c = (Comprador) row;
  14.             new CompradorModel(this.ip).save(c);
  15.         } else if(row instanceof Subastador){
  16.             Subastador s = (Subastador) row;
  17.             new SubastadorModel(this.ip).save(s);
  18.         } else {
  19.             Administrador a = (Administrador) row;
  20.             new AdministradorModel(this.ip).save(a);
  21.         }  
  22.     }

Digamos que soy nuevo usando Reflections, Metadatos y Anotaciones en Java, hace semanas que no le encuentro la vuelta.

Espero sus respuestas, las cuales agradeceré.

Saludos
  #2 (permalink)  
Antiguo 03/02/2017, 22:37
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con Reflection al usar herencias

Hola, les cuento que esta parte sólo me falta lo que pregunté, por favor alguna respuesta....
No sé que pasa que desde hace tiempo nadie responde a mis preguntas y me pongo a pensar:
1. ¿Será que pregunto cosas difíciles que nadie puede con ello?
2. ¿Soy mal visto en este foro?
3. ¿Lo que pregunto es tan aburrido?

Espero sus respuestas, Saludos.

PD: Lo finalizado lo pongo en este código x si alguien lo precisa, ¿por egoísmo mío no me ayudan?
  #3 (permalink)  
Antiguo 09/02/2017, 17:44
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con Reflection al usar herencias

Hola a todos, les cuento que parte del problema fue resuelto:

Código Java:
Ver original
  1. private LinkedList<Object>loadMethods(IPersistente ip) throws Exception{
  2.         LinkedList<Method> m = new LinkedList();
  3.         Method[] me = (ip.getClass().getSuperclass() != null) ? ip.getClass().getMethods() : ip.getClass().getDeclaredMethods();
  4.         for(Method campo : me){            
  5.             if (campo.getName().startsWith("get") && !campo.getName().startsWith("getClass")) {
  6.                 Method metodo = campo;
  7.                 if(metodo.getParameterCount() == 0) {
  8.                     if(metodo.isAnnotationPresent(Sort.class)){
  9.                         m.add(metodo);
  10.                     }
  11.                 }
  12.             }            
  13.         }
  14.         if(ip instanceof IDependiente && !ip.check()){
  15.             Collections.sort(m, new SortDesc());
  16.         } else {
  17.             Collections.sort(m, new SortAsc());
  18.         }
  19.         return load(ip, m);
  20.     }

Pero ahora me pregunta es: ¿Cómo puedo hacer para que los método de la subclase no se agreguen a la colección siempre y cuando la clase sea una subclase?

Saludos y espero sus respuestas...
  #4 (permalink)  
Antiguo 10/02/2017, 22:11
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con Reflection al usar herencias

Les cuento que pude hacer que las superclases no tomen los métodos de las subclases:

Código Java:
Ver original
  1. private LinkedList<Object>loadMethods(IPersistente ip) throws Exception{
  2.         LinkedList<Method> m = new LinkedList();
  3.         Method[] me = (ip.getClass().getSuperclass() != null) ? ip.getClass().getSuperclass().getDeclaredMethods() : ip.getClass().getDeclaredMethods();
  4.         for(Method campo : me){            
  5.             if (campo.getName().startsWith("get") && !campo.getName().startsWith("getClass")) {
  6.                 Method metodo = campo;
  7.                 if(metodo.getParameterCount() == 0) {
  8.                     if(metodo.isAnnotationPresent(Sort.class)){
  9.                         m.add(metodo);
  10.                     }
  11.                 }
  12.             }            
  13.         }
  14.         if(ip instanceof IDependiente && !ip.check()){
  15.             Collections.sort(m, new SortDesc());
  16.         } else {
  17.             Collections.sort(m, new SortAsc());
  18.         }
  19.         return load(ip, m);
  20.     }

Pero cuando quiero guardar la información de la subclase en su respectiva tabla me falla, cómo aparece aquí:

Código Java:
Ver original
  1. Method[] me = (ip.getClass().getSuperclass() != null) ?
  2.                 // aquí me llega siendo una subclase, cuando esto debería funcionar sólo con las superclases
  3.                 ip.getClass().getSuperclass().getDeclaredMethods() :
  4.                 ip.getClass().getDeclaredMethods();

Cómo ven falta poco, pero ese poco me complica, necesito sus respuestas y ayuda, por favor....

Saludos.
  #5 (permalink)  
Antiguo 15/02/2017, 12:52
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con Reflection al usar herencias

Les cuento que finalmente pude hacer andar el con las herencias tanto para la subclase cómo la subclase, pero ahora me falla para guardar las entidades simples, y todo por la condición del operador ternario que no se cómo adaptarla para todos los casos:

Código Java:
Ver original
  1. private LinkedList<Object>loadMethods(IPersistente ip) throws Exception{
  2.         LinkedList<Method> m = new LinkedList();        
  3.         Method[] me = (ip.getClass().getSuperclass() != null && ip.getId() == 0) ?
  4.                 ip.getClass().getSuperclass().getDeclaredMethods() :
  5.                 ip.getClass().getDeclaredMethods();        
  6.         for(Method campo : me){            
  7.             if (campo.getName().startsWith("get") && !campo.getName().startsWith("getClass")) {
  8.                 Method metodo = campo;
  9.                 if(metodo.getParameterCount() == 0) {
  10.                     if(metodo.isAnnotationPresent(Sort.class)){
  11.                         m.add(metodo);
  12.                     }
  13.                 }
  14.             }            
  15.         }
  16.         if(ip instanceof IDependiente && !ip.check()){
  17.             Collections.sort(m, new SortDesc());
  18.         } else {
  19.             Collections.sort(m, new SortAsc());
  20.         }
  21.         return load(ip, m);
  22.     }

Sólo queda arreglar el operador ternario para adaptarlo a todos los casos, y esto ya es historia..

Espero sus respuestas y saludos.

PD: No me rindo tan fácilmente.
  #6 (permalink)  
Antiguo 20/02/2017, 22:49
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con Reflection al usar herencias

Hola a todos, les cuento que pude hacer con herencias sin atributos en las subclases

Código Java:
Ver original
  1. private LinkedList<Object>loadMethods(IPersistente ip) throws Exception{
  2.         LinkedList<Method> m = new LinkedList();        
  3.         Child s = ip.getClass().getAnnotation(Child.class);
  4.         Method[] me = null;
  5.         if(s != null && ip.getId() == 0){
  6.             me = ip.getClass().getSuperclass().getDeclaredMethods();
  7.         } else {
  8.             me = ip.getClass().getDeclaredMethods();
  9.         }
  10.         for(Method campo : me){            
  11.             if (campo.getName().startsWith("get") && !campo.getName().startsWith("getClass")) {
  12.                 Method metodo = campo;
  13.                 if(metodo.getParameterCount() == 0) {
  14.                     if(metodo.isAnnotationPresent(Sort.class)){
  15.                         m.add(metodo);
  16.                     }
  17.                 }
  18.             }            
  19.         }
  20.         if(ip instanceof IDependiente && !ip.check()){
  21.             Collections.sort(m, new SortDesc());
  22.         } else {
  23.             Collections.sort(m, new SortAsc());
  24.         }
  25.         return load(ip, m);
  26.     }

Pero cuando se trata de una herencia donde la subclase además de heredar los atributos de la superclase, tiene los suyos no anda No value specified for parameter 1.

Espero sus respuestas y saludos.
  #7 (permalink)  
Antiguo 23/02/2017, 20:39
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con Reflection al usar herencias

Hola a todos, finalmente pude hacer que las altas con las herencias queden automatizadas, esto anda sólo que para las modificaciones no me pone al else para obtener los get de las subclases. Sólo queda eso.

Código Java:
Ver original
  1. private LinkedList<Object>loadMethods(IPersistente ip) throws Exception{
  2.         LinkedList<Method> m = new LinkedList();        
  3.         Child s = ip.getClass().getAnnotation(Child.class);
  4.         Method[] me = null;
  5.         if(s != null && ip.getId() == 0){
  6.             me = ip.getClass().getSuperclass().getDeclaredMethods();
  7.         } else {
  8.             // sólo este if queda para que las modificaciones con herencias se automaticen, xq con las altas pude
  9.             if(s != null){
  10.                 me = ip.getClass().getSuperclass().getDeclaredMethods();
  11.             } else {
  12.                 me = ip.getClass().getDeclaredMethods();
  13.             }          
  14.         }
  15.         for(Method campo : me){            
  16.             if (campo.getName().startsWith("get") && !campo.getName().startsWith("getClass")) {
  17.                 Method metodo = campo;
  18.                 if(metodo.getParameterCount() == 0) {
  19.                     if(metodo.isAnnotationPresent(Sort.class)){
  20.                         m.add(metodo);
  21.                     }
  22.                 }
  23.             }            
  24.         }
  25.         if(ip instanceof IDependiente && !ip.check()){
  26.             Collections.sort(m, new SortDesc());
  27.         } else {
  28.             Collections.sort(m, new SortAsc());
  29.         }        
  30.         return load(ip, m);
  31.     }

Espero sus respuestas y saludos.
  #8 (permalink)  
Antiguo 19/03/2017, 22:04
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con Reflection al usar herencias

Hoy decidí retomar esto xq se puede algo muy provechoso del mismo, está igual, preguntando si alguien ha llegado a esta instancia, porque ahora el problema está en las modificaciones con herencias para automatizar.
Ruego que no se menosprecie xq podemos llevar este código a otro nivel.
Si esto está mal planteado díganmelo xq lo puedo replantear de otra forma.

Espero sus respuestas y saludos.
  #9 (permalink)  
Antiguo 19/03/2017, 23:13
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 2 meses
Puntos: 52
Respuesta: Problemas con Reflection al usar herencias

Por qué no usas un ORM y listo? Es verdad que los ORMs de java apestan (igual que todo el resto de java en general), pero la verdad estas tratando de reinventar la rueda, y de una forma bastante mala, para ser honesto.
  #10 (permalink)  
Antiguo 20/03/2017, 18:35
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con Reflection al usar herencias

Hola aglevia, primero que todo gracias por responder, verás estoy usando hibernate pero me quedé trancado para persistir un onetomany, y no sé cómo rayos avanzar con eso..

Por otro lado agradezco tu sinceridad, xq paralelamente a lo de hibernate lo q estoy haciendo es para entender un poco cómo funciona los ORM de java (JPA, Hibernate entre otros), y quien no te dice en un futuro que se cree un framework basado en esto.
Tanto de tí y de otro leí esta frase: "estas tratando de reinventar la rueda, y de una forma bastante mala" pero ¿cómo sugerirían para empezar?

Espero sus respuestas y saludos.
  #11 (permalink)  
Antiguo 22/03/2017, 22:32
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con Reflection al usar herencias

Hola a todos, les cuento que es sólo a esto de lograrlo:

Código Java:
Ver original
  1. if(s != null && ip.getId() == 0){
  2.             me = ip.getClass().getSuperclass().getDeclaredMethods();
  3.         } else {
  4.             // sólo este if queda para que las modificaciones con herencias se automaticen, xq con las altas pude
  5.            // este if es el que me complica, xq primero quiero editar los métodos de las superclases y luego de las subclases.
  6.             if(s != null){
  7.                 //error de edición con subclases....
  8.                 me = ip.getClass().getSuperclass().getDeclaredMethods();
  9.             } else {
  10.                 me = ip.getClass().getDeclaredMethods();
  11.             }    
  12.         }

en la línea quiero buscar la forma de que me distinga para editar primero los métodos de la super clase y luego de la subclase, sólo a eso de lograrlo...

Espero sus respuestas y saludos.

Etiquetas: set, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:02.