import java.lang.reflect.*;

public class Explorateur 
{
   public Explorateur()
   {
   }
  
  public void explorerChamps(Object o)
  {
    Field[] f = null;
    Class c = null;
    
    c = o.getClass();
    f = c.getDeclaredFields();
    consulterChamps(f,o);
  
    int i = 1;
    while((c=c.getSuperclass()) != null)
    {
      f = c.getDeclaredFields();
      if(f.length != 0)
      {
        System.out.println("Héritage de niveau "+i+", Classe = "+c.getName());
        consulterChamps(f,o);
      }
      ++i;
    }
  }
  
  public void explorerMethodes(Object o)
  {
    Method[] m = null;
    Class c = null;
    
    c = o.getClass();
    m= c.getDeclaredMethods();
    consulterMethodes(m);
    
    int i = 1;
    while((c=c.getSuperclass()) != null)
    {
      m = c.getDeclaredMethods();
      if(m.length != 0)
      {
        System.out.println("Héritage de niveau "+i+", Classe = "+c.getName());
        consulterMethodes(m);
      }
      ++i;
    }
  }
  
  private void consulterInterfaces(Object o)
  {
    Class[] c = o.getClass().getInterfaces();
    for(int i=0;i<c.length;++i)
    {
      System.out.println(c[i]);
    }
  }
  
  private void consulterChamps(Field[] f, Object o)
  {
    for(int i=0;i<f.length;++i)
    {
      f[i].setAccessible(true);
      System.out.print(Modifier.toString(f[i].getModifiers()));
      System.out.print(" ");
      System.out.print(f[i].getType().getName());
      System.out.print(" ");
      System.out.print(f[i].getName());
      System.out.print(" = ");
      try
      {
        System.out.println(f[i].get(o));
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
    }
  }
  
  private void consulterMethodes(Method[] m)
  {
    Class[] params = null;
    for(int i=0;i<m.length;++i) 
    {
      m[i].setAccessible(true);
      System.out.print(Modifier.toString(m[i].getModifiers()));
      System.out.print(" ");
      System.out.print(m[i].getReturnType().getName());
      System.out.print(" ");
      System.out.print(m[i].getName());
      System.out.print("(");
      params = m[i].getParameterTypes();
      for(int j=0;j<params.length;++j)
      {
        System.out.print(params[j].getName());
      }
      System.out.println(")");
    }
  }

}