Java - Allgemein

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

Eigene Werkzeuge
Werkzeuge

gratis Counter by GOWEB
seit 9.10.2007