package reflection11;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.LinkedList;
import java.util.List;

/**
 * Aufruf von Methoden, auch von private Methoden.
 * 
 * @author  Ralf Kunze (rkunze@uos.de), Institut fuer Informatik, Universitaet Osnabrueck
 * @date 02.06.2007
 */
public class MethodenTest {

    public static void main(String[] args) {
        List<String> l = new LinkedList<String>();
        l.add("Ralf");
        l.add("Dorothee");
        Class<List<String>> c = (Class<List<String>>)l.getClass();
        try {
            

            Method m = c.getMethod("size");
            Integer i = (Integer)(m.invoke(l));
            System.out.println(i);
            
//            String s = "Heinz";
//            m = c.getMethod("add", Object.class);
//            m.invoke(l, s);
//            System.out.println(l);
//            
//            
//            s = "Hugo";
//            m = c.getMethod("add", Integer.TYPE, Object.class);
//            m.invoke(l, 0, s);
//            System.out.println(l);
//            
//            
//            m = c.getDeclaredMethod("entry", Integer.TYPE);
//            if(m.getModifiers()==Modifier.PRIVATE) {
//                System.out.println("Die Methode " + m + " ist private");
//            }
//            m.setAccessible(true);
//            Object o = m.invoke(l, 0);
//            System.out.println(o);
//            
//            
//            
//            Class c2 = o.getClass();
//            
//            for(Field f: c2.getDeclaredFields()) {
//                f.setAccessible(true);
//                System.out.println(f.getName() + ": " + f.get(o));
//            }
            
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        
    }

}
