Ir al contenido principal

Como obtener las diferencias entre dos objectos de la misma clase (Java)


Hace poco me encontré con un problema que necesitaba saber como obtener las diferencias entre dos objetos de la misma clase en java, buscando por Google, presentar varios API's que realizan esta función,   debido a la poca documentación y la dificultad de uso cuando se requiere algo tan sencillo decidí crear mi propio código que les dejo a continuación.

Archivos de código aquí: 


Código:

//Clase que hace la comparación de los objetos de la misma clase para buscar diferencias.

import ValorCambio;
import java.lang.reflect.InvocationTargetException;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.beanutils.BeanUtils;


public class ValidadorCambios {
 
     public List CamposCambiados(Object objetoOriginal,Object objetoModificado){
        
        
         List valoresModificados = new ArrayList();
         
         Object f1 = (Object)objetoOriginal;
        
        Object f2 = (Object)objetoModificado;
        
        
        try {
            Map properties1 = BeanUtils.describe(f1);
           
            //System.out.println("Propiedades" + properties1.values());
            Map properties2 = BeanUtils.describe(f2);
            
            //System.out.println("Propiedades" + properties2.values());
            
            String resultado = "";
            
            for(int i=0;i< properties1.size() ;i++){
                 String p1 = (String)properties1.values().toArray()[i];
                  String p2 =(String)properties2.values().toArray()[i];
                  String campo = (String)properties1.keySet().toArray()[i];
                    
                  
                  if(p1==null){
                      p1 = "";
                  }
                  if(p2==null){
                      p2= "";
                  }
                  
                    System.out.println(campo+"P1**" + p1 + "*P2**"+ p2);
                
                if(p1==null && p2==null ){
                    p1="";
                    p2="";
                }
                if(p1==null && p2!=null ){
                    resultado += "*diffnull*" + (properties1.keySet().toArray())[i];
                }
                
                if(p1!=null && p2==null ){
                    resultado += "*diffnull*" + (properties1.keySet().toArray())[i];
                }
                
                if(p1!=null && p2!=null){
                    if(!p1.equals(p2)){
                        
                        
                        ValorCambio valorCambio = new ValorCambio();
                        valorCambio.setNombreCampo(""+(properties1.keySet().toArray())[i]);
                        valorCambio.setValorAnterior(p1);
                        valorCambio.setValorNuevo(p2);
                        
                        
                        valoresModificados.add(valorCambio);
                        
                        resultado += "*diferencia*"+(properties1.keySet().toArray())[i]+"*ValorAnterior*"+p1+"*ValorNuevo*"+p2+"\n ";
                    }
                }
                
            }
            
            System.out.println("RESULTADO" + resultado);
            
            
        } catch (IllegalAccessException ex) {
            Logger.getLogger(FormularioDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(FormularioDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchMethodException ex) {
            Logger.getLogger(FormularioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
        return valoresModificados;
    } 
     
}

//Clase Valor cambio, se recorre para saber que campo cambio y en que valor.

public class ValorCambio {
    
    private String nombreCampo;
    private String valorAnterior;
    private String valorNuevo;

    /**
     * @return the nombreCampo
     */
    public String getNombreCampo() {
        return nombreCampo;
    }

    /**
     * @param nombreCampo the nombreCampo to set
     */
    public void setNombreCampo(String nombreCampo) {
        this.nombreCampo = nombreCampo;
    }

    /**
     * @return the valorAnterior
     */
    public String getValorAnterior() {
        return valorAnterior;
    }

    /**
     * @param valorAnterior the valorAnterior to set
     */
    public void setValorAnterior(String valorAnterior) {
        this.valorAnterior = valorAnterior;
    }

    /**
     * @return the valorNuevo
     */
    public String getValorNuevo() {
        return valorNuevo;
    }

    /**
     * @param valorNuevo the valorNuevo to set
     */
    public void setValorNuevo(String valorNuevo) {
        this.valorNuevo = valorNuevo;
    }
    
    
}

Comentarios

Entradas populares de este blog

Operación no admitida. Un documento procesado por el motor JRC no se puede abrir en la pila C++.

A muchos les habra pasado este error cuando intentaron generar un informe creado en crystal reports cuando se publica la aplicación. La solucion es sencilla, lo que pasa es que cuando se publica la aplicacion los archivos  *.rpt no quedan copiados en el path con la solucion, asi que en el path (en el servidor)  se deben copiar y pegar los archivos *.rpt. La ruta es la misma de la solución de visual studio. Y solucionado.

Error: 503 service unavailable + (13)Permission denied: AH00957: HTTP: attempt to connect to (* . * . * . * ) failed

Realizando la configuración de un servidor Apache en un Oracle Linux 7  me ocurrió el siguiente problema:  (13)Permission denied: AH00957: HTTP: attempt to connect to IP (* . * . * . * ) failed AH00959: ap_proxy_connect_backend disabling worker for ( * . * . * . * ) for 60s A pesar que el proxy reverso devolvía la información para otros servicios, el que me encontraba configurando generaba el error "503 service unavailable" y los otros servicios por proxy reverso funcionaban perfectamente.  Para solucionar esto se debe ejecutar el comando, en terminal:  /usr/sbin/setsebool -P httpd_can_network_connect 1 Con esto ya funcionara normal la conexión al servicio por proxy reverso. 

¡Cuidado! - Correo falso de bancolombia

Abro mi correo y me encuentro con el siguiente mensaje.  Es una copia exacta de un correo real de Bancolombia y quizás a primera vista no es muy obvio que se trata de un correo falso, con el objetivo de robar información o instalar un virus en el computador.  He resaltado en la imagen el dominio de donde se  envió el correo, que es el principal indicio, que es un correo falso, dice co.bancofalabella lo cual indica que el correo fue enviado de un dominio falso, no se dejen engañar tampoco es de bancofalabella.  El correo tiene un vinculo supuestamente a https://www.grupobancolombia.com/ no se atrevan a tocar ese vinculo, los llevará a otra dirección. Muy probablemente con un virus o una pagina falsa para robar sus datos o acceso bancario.  Simplemente cuando vean un correo que parezca original, en primer lugar verifiquen el dominio de la empresa que envió el correo, aun así no se confíen si ven algo extraño, lo mejor es comunicarse directamente con la entidad p