Ich verwende einige Anmerkungen, um Werte von Feldern in Klassen dynamisch festzulegen. Da ich dies unabhängig davon tun möchte, ob es öffentlich, geschützt oder privat ist, rufe ich setAccessible(true)
das Field-Objekt jedes Mal auf, bevor ich die set()
Methode aufrufe. Meine Frage ist, welche Auswirkungen der setAccessible()
Anruf auf das Feld selbst hat.
Angenommen, es handelt sich um ein privates Feld, und dieser Satz von Code ruft auf setAccessible(true)
. Wenn an einer anderen Stelle im Code dasselbe Feld durch Reflexion abgerufen werden würde, wäre das Feld dann bereits zugänglich? Oder geben die Methoden getDeclaredFields()
und getDeclaredField()
jedes Mal neue Instanzen eines Field-Objekts zurück?
Ich denke, eine andere Möglichkeit, die Frage zu stellen, ist, wenn ich anrufe setAccessible(true)
, wie wichtig es ist, sie nach Abschluss auf den ursprünglichen Wert zurückzusetzen.
quelle
throws Exception
behandelt auchNoSuchFieldException
, aber Sie möchten vielleicht etwas ausführlicher damit umgehen.Die
getDeclaredField
Methode muss jedes Mal ein neues Objekt zurückgeben, genau weil dieses Objekt das veränderbareaccessible
Flag hat. Das Flag muss also nicht zurückgesetzt werden. Die vollständigen Details finden Sie in diesem Blogbeitrag .quelle
Wie andere Poster angegeben haben,
setAccessible
gilt dies nur für diese Instanz von Ihnen. Daherjava.lang.reflect.Field
ist es nicht erforderlich, die Barrierefreiheit auf den ursprünglichen Zustand zurückzusetzen.Jedoch...
Wenn Sie möchten, dass Ihre Aufrufe
field.setAccessible(true)
dauerhaft sind, müssen Sie die zugrunde liegenden Methoden injava.lang.Class
und verwendenjava.lang.reflect.Field
. Die öffentlich zugänglichen Methoden senden Ihnen Kopien derField
Instanz, sodass sie nach jedem Vorgang "vergisst"class.getField(name)
Update : Diese Implementierung ist für Java 8, zukünftige Versionen ändern das Backend, wodurch dies unterbrochen wird. Das gleiche Konzept gilt jedoch weiterhin, falls Sie diese Strategie wirklich fortsetzen möchten.
quelle
quelle