wtorek, 27 listopada 2007

Prywatne jak publiczne...

Czy można odczytać i nawet modyfikować w Javie zmienne prywatne?
Okazuje się, że tak...
Kluczem do tego jest mechanizm refleksji, który pozwala dobrać się do informacji o klasie i je zmodyfikować:

import java.lang.reflect.Field;

class FieldTest {
private String privateString = "Hello, World!";
}

public class privTest {

public static void main(String args[]) throws Exception {
FieldTest fieldTest = new FieldTest();

Field f = FieldTest.class.getDeclaredField("privateString");
System.out.println("Private Field: " + f);

f.setAccessible(true);
System.out.println(f.get(fieldTest));

f.set(fieldTest, "bulba");
System.out.println(f.get(fieldTest));
}

}


Co my tu mamy? Deklarujemy sobie klasę FieldTest z jednym prywatnym stringiem...
Właściwy kod jest w klasie privTest. Pobieramy obiekt reprezentujący informacje o polu 'privateString' a następnie zmieniamy je na dostępne przez setAccessible...
i już możemy robić z prywatną zmienną to co nam się podoba :)
Podobnie można zmodyfikować dostęp do konstruktorów i metod prywatnych.

Brak komentarzy: