2016-07-25 15 views
1

las ich den folgenden Artikel über Reflexion in Java:Kann Reflexion den Zustand eines Objekts ändern?

https://community.oracle.com/docs/DOC-983192

Darin beschreibt der Autor, wie die Werte eines Objekts Felder durch Reflexion ändern. Er erklärt, wie man es macht, selbst wenn das Feld einen privaten Zugang hat.

Während ich zurück war, las ich Joshua Block's Buch: "Effective Java". Dort sagt er, dass wir, um unsicheren Zugriff auf die Felder, Methoden usw. eines Objekts zu verhindern, wann immer möglich, Feldern und Methoden den restriktivsten Modifizierer geben sollten (dh privat wann immer möglich, öffentlich oder geschützt, wenn es Teil des ausgesetzt api).

Meine Frage ist folgende:

Warum kann die Mühe der Gestaltung Ihrer Klassen nicht sinnvoll, Informationen aussetzen, wenn sie ohnehin durch Reflexion zugegriffen werden?

sollte (Eigentlich habe ich für das Stück von Informationen bin zu fragen, dass ich fehle zu verstehen, dieses Thema)

+3

Wenn Sie ein privates oder geschütztes Feld markieren, können Benutzer Ihrer Bibliothek oder API wissen, wie sie dieses Feld verwenden (oder nicht verwenden) sollen. Es ist nicht nur eine Frage der Sicherheit. – rmlan

+8

Dinge privat machen ist wie eine isolierte Abdeckung auf einer Steckdose: es zeigt den Menschen, wie Sie wollen, dass sie es benutzen; aber es hört nicht auf, dass jemand die Front abschraubt und die stromführenden Kabel berührt. –

+2

Es ist auch möglich, einen SecurityManager zu verwenden, um reflektive Änderungen zu verhindern. Siehe http://stackoverflow.com/questions/7566626/how-to-restrict-developers-to-use-reflection-to-access-private-methods-and-const – dnault

Antwort

3

Für eine Sache, ‚privat‘ nicht als Sicherheitsmerkmal. Siehe this similar question. Java hat ein Sicherheitssystem, das Sie verwenden sollten, wenn Sie diese Art von Schutz wirklich wollen.

"privat" in OOP ist ein Signal der Absicht und ist Teil des Vertrags Ihrer Klasse. Indem du ein Feld als "privat" markierst, sagst du, dass, wenn sich jemand schleicht und Dinge durch Reflexion oder etwas verändert, dann sind alle Garantien, die du im Rest deiner Klasse machst, nicht länger gültig.

Es ist ein bisschen wie das Kleingedruckte in der Garantie Ihres Fernsehers oder anderer Geräte - wenn Sie beginnen, in der Verkabelung (die privaten Felder sozusagen) zu graben, dann ist die Garantie ungültig und Samsung oder wer auch immer es ist deckt nicht die Kosten für die Reparatur von allem, was Sie vermasseln können, während Sie dort drin sind.