Zugriff auf private Felder/Variablen anderer Klassen (Reflection)
Manchmal ist es extrem hilfreich, wenn man auf private Felder anderer Klassen (insbesondere Bibliotheken) zugreifen kann. Theoretisch kann der SecurityManager dies unterbinden. Praktisch ist das aber fast nie der Fall.
Natürlich sollte einem beim Verwenden eines solchen Hacks bewusst sein, dass diese Art von Zugriff zu Problemen führen kann. Insbesondere könnte in einer späteren Version einer gedachten Libary die Variable nicht mehr existieren oder umbenannt sein.
Im folgenden Beispiel wird auf die privaten Felder von MyClass zugegriffen.
package com.sowas.javawiki.privatefieldaccess; import java.lang.reflect.Field; public class PrivateFieldAccess{ public static void main(String[] args){ MyClass myClass = new MyClass(); Field[] fields = MyClass.class.getDeclaredFields(); Field theIntegerField = null; Field theIntField = null; // Referenzen auf die privaten Felder holen und den Zugriff erlauben: for (Field field : fields) { if ("numObj".equals(field.getName())) { theIntegerField = field; theIntegerField.setAccessible(true); } if ("num".equals(field.getName())) { theIntField = field; theIntField.setAccessible(true); } } // Private Felder auslesen und anschließend neu setzen: try { Integer numObj = (Integer)theIntegerField.get(myClass); System.out.println(numObj); // 123 theIntegerField.set(myClass, new Integer(++numObj.intValue())); System.out.println(myClass.getNumObj()); // 124 int num = ((Integer)theIntField.get(myClass)).intValue(); System.out.println(num); // 456 theIntField.setInt(myClass, ++num); System.out.println(myClass.getNum()); // 457 }catch (IllegalArgumentException e) { e.printStackTrace(); }catch (IllegalAccessException e) { e.printStackTrace(); } } } class MyClass{ private Integer numObj = new Integer(123); private int num = 456; public int getNumObj(){ return numObj; } public int getNum(){ return num; } }
Stichworte:
private Membervaribalen Variablen Felder Zugriff Reflection