Wie kann Spring / Hibernate auf private Mitglieder zugreifen?

8

Wie Sie wissen, kann Spring Werte für private Instanzvariablen injizieren, und Hibernate kann auf private Variablen persistenter Klassen zugreifen. Ich kann jedoch nicht einmal geschützte Methoden einer Klasse durch Reflexion nennen! Wie können Spring und Hibernate die Sicherheit so unverhohlen durchbrechen? Und noch wichtiger, wie mache ich das? : D

    
Tom Tucker 08.11.2010, 19:41
quelle

3 Antworten

8

Wenn Sie ohne prohibitiven Sicherheitsmanager arbeiten, können Sie die entsprechende Methode oder das entsprechende Feld über eine Reflektion abrufen und setAccessible () darauf.

Mit dem Java-Sicherheitsmanager können Sie das natürlich deaktivieren, indem Sie eine benutzerdefinierte Richtlinie schreiben.

    
Eugene Kuleshov 08.11.2010, 19:46
quelle
3

Sie können private eine Variable eines anderen Objekts durch Reflexion festlegen. Hier ist ein Beispiel, wie es geht. Betrachten Sie das folgende Objekt mit einer privaten Variablen:

%Vor%

Normalerweise ist das Feld message nicht von außen auf MyBean zugreifbar, jedoch kann SnoopyClass seinen Wert setzen und abrufen. Ich habe zwei statische Methoden geschrieben: setValue , die einen Wert in ein privates Feld namens fieldName einer Object Bean und eine getValue setzen können Methode, die den Wert einer privaten Variablen namens fieldName von einer Object -Bohne abrufen kann.

Die main -Methode demonstriert ihre Verwendung, indem sie eine Object of MyBean-Klasse erstellt, die -Nachricht variabel setzt und sie abruft. Ich habe diesen Code tatsächlich als eigenständige Anwendung getestet und es funktioniert.

%Vor%

Die Implementierung verwendet die getDeclaredField -Methode für die Klasse des Objekts, da diese Methode nach allen Feldern, sogar nach privaten, suchen kann. Im Gegensatz dazu kann getField nur auf öffentliche Mitglieder zugreifen. Der nächste Schritt ist das Aufrufen von setAccessible für das Feld, um das Lesen und Schreiben zu ermöglichen. Der letzte Schritt besteht darin, einfach die Methoden get und set zu verwenden, die von der Klasse java.lang.reflect.Field bereitgestellt werden.

Diese Art von Manipulation ist nur erlaubt, wenn der Sicherheitsmanager dies erlaubt. Standardmäßig installiert Java keinen Sicherheitsmanager. In einem eigenständigen Programm, das Sie über Ihre IDE oder die Befehlszeile starten, haben Sie daher keine Probleme, diese Technik zu verwenden. Ich habe es auch in einer Spring Application unter Tomcat versucht, und es funktioniert immer noch.

Die primäre Anwendung, zumindest für mich, ist es, private Variablen in meinen Komponententests zu setzen, insbesondere für Spring Beans, ohne die Schnittstelle mit unnötigen Setter zu verschmutzen.

    
stivlo 29.10.2011 05:19
quelle
1

Hibernate kann über den Zugriffskonfigurationsmechanismus auf Feldebene auf private Mitglieder zugreifen. Aus der Dokumentation, Abschnitt 5.1.11

"Mit dem access-Attribut können Sie steuern, wie Hibernate zur Laufzeit auf die Eigenschaft zugreift. Standardmäßig ruft Hibernate das property get / set-Paar auf. Wenn Sie access=" field "angeben, umgeht Hibernate das get / set-Paar Greife direkt auf das Feld zu. "

    
hvgotcodes 08.11.2010 19:45
quelle

Tags und Links