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
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 230
Antigüedad: 5 años, 10 meses
Puntos: 2
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
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 230
Antigüedad: 5 años, 10 meses
Puntos: 2
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
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 230
Antigüedad: 5 años, 10 meses
Puntos: 2
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
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 230
Antigüedad: 5 años, 10 meses
Puntos: 2
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
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 230
Antigüedad: 5 años, 10 meses
Puntos: 2
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
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 230
Antigüedad: 5 años, 10 meses
Puntos: 2
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
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 230
Antigüedad: 5 años, 10 meses
Puntos: 2
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.



La zona horaria es GMT -6. Ahora son las 23:30.