Wie Sie wissen, kann Spring Werte für private Instanzvariablen einbringen, 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? : DWie kann der Zugriff auf private Mitglieder im Frühling/Winterschlaf erfolgen?
Antwort
Wenn Sie ohne prohibitiven Sicherheitsmanager arbeiten, können Sie die entsprechende Methode oder das entsprechende Feld durch Reflektion abrufen und setAccessible() darauf aufrufen.
Mit dem Java-Sicherheitsmanager können Sie das natürlich deaktivieren, indem Sie eine benutzerdefinierte Richtlinie schreiben.
Hibernate kann über den Zugriffskonfigurationsmechanismus auf Feldebene auf private Mitglieder zugreifen. Aus der Dokumentation Abschnitt 5.1.11
"Mit dem Zugriffsattribut 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, wird Hibernate Umgehen Sie das Get/Set-Paar und greifen Sie direkt auf das Feld zu, indem Sie die Reflektion verwenden. "
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 Variable:
public class MyBean {
private String message;
}
Normalerweise wird die Nachricht Feld von außen nicht zugänglich wären MyBean jedoch SnoopyClass kann seinen Wert gesetzt und erhalten. Ich schrieb zwei statische Methoden: setValue
, die einen Wert in ein privates Feld Feldname ein Objekts Bohne und eine getValue
Methode, die den Wert einer privaten Variable mit dem Namen festlegen Feldnamen aus einem Objekt Bohne genannt bekommen kann.
Die Haupt Verfahren zeigt nur seine Verwendung durch ein Objekt der Klasse MyBean Erstellen Einstellen der Nachricht variable und Abrufen von ihm. Ich habe diesen Code tatsächlich als eigenständige Anwendung getestet und es funktioniert.
import java.lang.reflect.Field;
public class SnoopyClass {
private static void setValue(Object bean, String fieldName, Object value)
throws IllegalArgumentException, IllegalAccessException,
SecurityException, NoSuchFieldException {
Field privateVar = bean.getClass().getDeclaredField(fieldName);
privateVar.setAccessible(true);
privateVar.set(bean, value);
}
private static Object getValue(Object bean, String fieldName)
throws IllegalArgumentException, IllegalAccessException,
SecurityException, NoSuchFieldException {
Field privateVar = bean.getClass().getDeclaredField(fieldName);
privateVar.setAccessible(true);
return privateVar.get(bean);
}
public static void main(String[] argv)
throws IllegalArgumentException, SecurityException,
IllegalAccessException, NoSuchFieldException {
MyBean instance = new MyBean();
setValue(instance, "message", "Shht! Don't tell anyone!");
System.out.println("The message is '" + getValue(instance, "message"));
}
}
Die Implementierung verwendet getDeclaredField
Methode für die Klasse des Objekts, da diese Methode für alle Bereiche sehen kann, auch privat. Im Gegensatz dazu kann getField
nur auf öffentliche Mitglieder zugreifen. Der nächste Schritt lautet setAccessible
auf dem Feld, um es lesen und schreiben zu können. Der letzte Schritt ist, verwenden Sie einfach die get
und set
Methoden von der java.lang.reflect.Field
Klasse zur Verfügung gestellt.
Diese Art der 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-Anwendung unter Tomcat versucht, und es funktioniert immer noch. Die primäre Anwendung, zumindest für mich, ist die Möglichkeit, private Variablen in meinen Komponententests, insbesondere für Spring Beans, zu setzen, ohne die Schnittstelle mit unnötigen Setter zu verschmutzen.
- 1. PowerMock Zugriff private Mitglieder
- 2. Zugriff auf private Mitglieder von Powershell
- 3. Zugriff auf private Mitglieder einer Superklasse
- 4. Kann ZendAMF private Mitglieder haben?
- 5. Wie kann der Mustervergleich auf Text erfolgen?
- 6. C#: Zugriff auf vererbte private Instanz Mitglieder durch Reflexion
- 7. Private Klassenkonstruktor kann nicht auf private Mitglieder zugreifen
- 8. Wie kann der Zugriff auf statische öffentliche Mitglieder eingeschränkt werden?
- 9. Entwurfsmuster: Private Mitglieder speichern
- 10. TYPO3 wie verschachtelt private Mitglieder
- 11. Memberspaces können private Mitglieder der Elternklasse zugreifen
- 12. Zugriff auf private Variablen
- 13. Private Mitglieder der C++ Bibliothek verstecken
- 14. Öffentliche Eigenschaften und private Mitglieder C#
- 15. Freund mit Klasse, aber kann nicht auf private Mitglieder zugreifen
- 16. C++ - Friend-Funktion kann nicht auf private Mitglieder zugreifen
- 17. Zugriff auf private Bilder beschränken
- 18. Zugriff auf private Gitlab-Repository
- 19. Zugriff auf Guid Mitglieder in C#
- 20. Zugriff auf private Funktionen im importierten Modul in JS?
- 21. Vorlage Meta-Code und private Mitglieder
- 22. C++ private Vererbung und statische Mitglieder/Typen
- 23. Wie kann eine Klasse nur auf bestimmte private Mitglieder einer anderen Klasse zugreifen?
- 24. Generics: Zugriff auf neue Mitglieder, nicht versteckte Mitglieder
- 25. Python: Zugriff auf Mitglieder eines Satzes
- 26. Javadoc mit Gradle: zeige auch private Mitglieder
- 27. Zugriff auf Array-Mitglieder nicht möglich
- 28. Kein Zugriff auf geschützte Mitglieder object.MemberwiseClone() '
- 29. Kann nicht geerbten Mitglieder der Klasse Zugriff in Konstruktor
- 30. Scala Makros: Zugriff auf Mitglieder mit quasiquotes
Effektiv ein Duplikat von http://stackoverflow.com/questions/3391256/how-java-jaxb-works – skaffman