Warum ist es erlaubt, access, Java private Felder per reflection?
Betrachten Sie dieses Beispiel :
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
C c = new C();
try {
Field f = C.class.getDeclaredField("a");
f.setAccessible(true);
Integer i = (Integer)f.get(c);
System.out.println(i);
} catch (Exception e) {}
}
}
class C {
private Integer a =6;
}
Scheint es unlogisch, dass Sie berechtigt sind, Zugriff auf private Felder von Klassen mit reflection. Warum ist so eine Funktionalität zur Verfügung? Ist es nicht "gefährlich" Zugriff?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Private soll verhindern, dass ein versehentliches Missbrauch, nicht als Sicherheitsmechanismus. Wenn Sie sich entscheiden, diese zu umgehen, dann können Sie dies auf eigene Gefahr und die Annahme, Sie wissen, was Sie tun.
Beide
getDeclaredField()
undsetAccessible()
sind eigentlich die Prüfung durch den security-manager und eine Ausnahme werfen, wenn Ihr code ist nicht erlaubt, dies zu tun. Mehr als oft nicht, Sie wird es nicht bemerken, weil Java-code wird oft ausgeführt, ohne dass ein security-manager.Gibt es eine wichtige Ausnahme sind Applets, die laufen immer mit einem security manager.
Ja es ist nicht schön, aber es erlaubt frameworks wie Java-Serialisierung zu arbeiten.
Ich glaube, dass die Funktionalität kann deaktiviert werden, durch die
SecurityManager
http://javabeans.asia/2008/10/12/how_to_set_securitymanager_and_java_security_policy_programmatically.html
Reflexion ist gefährlich. Zeitraum.
Was ist der Sinn in der Begrenzung der Nützlichkeit einer wirklich gefährlichen system zuliebe immer so leicht erhöhte Sicherheit?
Auch, eine automatisierte Serialisierung erfordert die Fähigkeit zu "saugen die Gehirne" aus jeder Klasse; ignorieren zugriffsmodifizierer ist eine Notwendigkeit in diesem Fall.
Reflexion ist eine komplette API für die erste innen-Klassen. Private Mitglieder und alle.
In Fällen, In denen Sie nicht Vertrauen, den code, den Sie sind, ausgeführt werden (applets und dergleichen), können Sie verhindern, dass der code aus mit der spiegelung überhaupt. Sehen dieser Stack Overflow Frage für details.
Aus der Beschreibung des
java.lang.reflektieren
Paket:Reflexion stellt einen Mechanismus für den Zugriff auf Informationen über Klassen durch die Mittel, die in der Regel nicht zur Verfügung, die durch regelmäßige Interaktion zwischen Klassen und Objekten. Ein solcher ist der Zugriff auf private Felder aus, die außerhalb von Klassen und Objekten.
Ja, der Reflexion im Allgemeinen kann in der Tat gefährlich, da Sie können aufzudecken die Interna der Klassen und Objekte.
Aber es ist auch ein sehr mächtiges Werkzeug, das verwendet werden kann, um untersuchen Sie die Funktionsweise von Klassen und Objekten, die kann nicht zugegriffen werden, die von anderen standard-Mittel.
Aus: http://java.sun.com/docs/books/tutorial/reflect/
Es ist ein tool, mit dem man Regeln zu brechen, man kann werfen Sie es über den Fuß, oder verwenden Sie es ordnungsgemäß.