
package ejemploreflection;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class EjemploReflection {

    public static void main(String[] args) throws Exception {
        
        Clase1 primerObjetoClase1 = new Clase1();
        primerObjetoClase1.setAtributo1("Lo importante no es donde estamos, sino hacia donde nos dirigimos");
        primerObjetoClase1.setAtributo2(new Integer(24));
        
        System.out.println("-----------  NOMBRE DE LA CLASE  ------------------------------");
        Class fichaInformacionClase1 = primerObjetoClase1.getClass();            
        System.out.println("path y nombre de la clase:  "+fichaInformacionClase1.getName());  
        
        System.out.println("-----------  ATRIBUTOS  ---------------------------------------");
        System.out.println("Esta clase encapsula los siguientes atributos: ");
        Field[] relacionAtributos = fichaInformacionClase1.getDeclaredFields();    
        for (int i=0; i<relacionAtributos.length; i++)
            System.out.println(relacionAtributos[i].getName()+"   es del tipo   "+relacionAtributos[i].getType());
        
        System.out.println("-----------  METODOS  -----------------------------------------");
        Method[] relacionMetodos = primerObjetoClase1.getClass().getMethods();
        for (int i=0; i<relacionMetodos.length; i++) {
            String nombreMetodo = relacionMetodos[i].getName();
            System.out.println("METODO :  "+nombreMetodo+"       devuelve    "+relacionMetodos[i].getReturnType());           
            if (nombreMetodo.indexOf("getAtributo") == 0) {
                Object objetoDevuelto = relacionMetodos[i].invoke(primerObjetoClase1, args);
                if (objetoDevuelto instanceof String) {
                    String cadenaDevuelta = (String) objetoDevuelto;
                    System.out.println("El método "+nombreMetodo+"  devuelve el String :  "+cadenaDevuelta);
                }
                else
                    if (objetoDevuelto instanceof Integer) {
                        int intDevueltoDesencapsulado = ((Integer) objetoDevuelto).intValue();
                        System.out.println("El método "+nombreMetodo+"  devuelve el int desencapsulado : "+intDevueltoDesencapsulado);                        
                    }
            }
        }
       
        System.out.println("-----------  SEGUNDO OBJETO INSTANCIADO  ----------------------");
        Clase1 segundoObjetoClase1 = (Clase1)fichaInformacionClase1.newInstance();   
        segundoObjetoClase1.setAtributo1("Cadena encapsulada en segundo objeto");
        segundoObjetoClase1.setAtributo2(new Integer(100));
        System.out.println("El segundo objeto encapsula :");
        System.out.println(segundoObjetoClase1.getAtributo1());
        System.out.println(segundoObjetoClase1.getAtributo2().intValue());  
        
        System.out.println("-----------  TERCER OBJETO INSTANCIADO  -----------------------"); 
        Class ficha2InformacionClase1 = Clase1.class;
        Clase1 tercerObjetoClase1 = (Clase1)ficha2InformacionClase1.newInstance();  
        
              // La relación de atributos de Clase1 se obtuvo anteriormente
              // "Seteamos" valores a los atributos
        for (int i=0; i<relacionAtributos.length; i++)
            if ((relacionAtributos[i].getType()).toString().compareTo("class java.lang.String") == 0 ) {
                relacionAtributos[i].set(tercerObjetoClase1, "Cadena encapsulada en tercer objeto");
            }
            else
                if ((relacionAtributos[i].getType()).toString().compareTo("class java.lang.Integer") == 0 ) {
                    relacionAtributos[i].set(tercerObjetoClase1, new Integer(200));
                }
        
              // "Geteamos" los valores de los atributos
        System.out.println("El tercer objeto encapsula :");      
        for (int i=0; i<relacionAtributos.length; i++)
            if ((relacionAtributos[i].getType()).toString().compareTo("class java.lang.String") == 0 ) {
                String cadena = (String) relacionAtributos[i].get(tercerObjetoClase1);
                System.out.println("cadena");
            }
            else
                if ((relacionAtributos[i].getType()).toString().compareTo("class java.lang.Integer") == 0 ) {
                    int numero = ((Integer) relacionAtributos[i].get(tercerObjetoClase1)).intValue();
                    System.out.println(numero);
                }      
    }  
}
