package reflection10;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

/**
 * Zugriff auf private Felder mittels Reflect.
 * 
 * @author  Ralf Kunze (rkunze@uos.de), Institut fuer Informatik, Universitaet Osnabrueck
 * @date 02.06.2007
 */
public class VariablenTest {

    public static void main(String[] args) {
        
        Person p = new Person("Heinz Wacker", 42);
        Class c = p.getClass();
        
        Field[] fields = c.getDeclaredFields();
        AccessibleObject.setAccessible(fields, true); 
        
        System.out.println("Vor der Veränderung: " + p);
        
        for(Field f: fields) {
            Object value = null;
            try {
                value = f.get(p);
                System.out.print("Wert gelesen: " + value);
                if(f.getModifiers()!=Modifier.PUBLIC) {
                    System.out.println("  OBWOHL DER WERT NICHT PUBLIC IST!!");
                } else System.out.println();
                
                if (f.getType()== String.class) {
                    f.set(p, "NEUER WERT " + value);
                } else if(f.getType()==Integer.TYPE) {
                    f.setInt(p, (Integer)value + 1000000);
                }
                
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Nach der Veränderung: " + p);
        
//        System.out.println("\n\nZugriff auf ein ArrayList-Objekt");
//        List<String> l = new ArrayList<String>();
//        Field[] listFields = l.getClass().getDeclaredFields();
//        AccessibleObject.setAccessible(listFields, true);
//        
//        for(Field f: listFields) {
//            Object value = null;
//            try {
//                value = f.get(l);
//                System.out.print(f.getName() + ": " + value);
//                if(f.getModifiers()!=Modifier.PUBLIC) {
//                    System.out.println("  OBWOHL DER WERT NICHT PUBLIC IST!!");
//                } else System.out.println();
//            } catch (IllegalArgumentException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            } catch (IllegalAccessException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
//        }
    }

}
