Réflexion Java - impact de setAccessible(vrai)
Je suis en utilisant quelques annotations pour définir dynamiquement les valeurs de champs dans les classes. Car je veux faire ce peu importe si c'est public, protected ou private, je suis un appel setAccessible(true)
sur le Champ de l'objet à chaque fois avant d'appeler la set()
méthode. Ma question est quel type d'incidence le setAccessible()
appelez sur le champ lui-même?
Plus précisément, dire que c'est un domaine privé et cet ensemble de code appelle setAccessible(true)
. Si un autre endroit dans le code a été puis de récupérer le même domaine, à travers la réflexion, le champ déjà être accessible? Ou ne le getDeclaredFields()
et getDeclaredField()
méthodes de retour de nouvelles instances d'un objet de Champ à chaque fois?
Je suppose une autre façon d'affirmer la question est de savoir si je l'appelle setAccessible(true)
, comment est-il important de revenir à la valeur d'origine après je suis fait?
Vous devez vous connecter pour publier un commentaire.
Avec
setAccessible()
vous permettent de modifier le comportement de laAccessibleObject
, c'est à dire laField
exemple, mais pas le champ réel de la classe. Voici la la documentation (extrait):Et un exécutable exemple:
throws Exception
gère égalementNoSuchFieldException
, mais vous pouvez le gérer dans une version plus élaborée.La
getDeclaredField
méthode doit renvoyer un nouvel objet à chaque fois, exactement parce que cet objet a la mutableaccessible
drapeau. Donc, il n'est pas nécessaire de réinitialiser l'indicateur. Vous pouvez trouver tous les détails dans ce blog.Que d'autres affiches ont indiqué,
setAccessible
est uniquement applicable à l'exemple de votrejava.lang.reflect.Field
, le choix de l'accessibilité à son état d'origine n'est pas nécessaire.Cependant...
Si vous voulez que vos appels à
field.setAccessible(true)
être persistant, vous devez utiliser des méthodes dansjava.lang.Class
etjava.lang.reflect.Field
. Le public face à des méthodes de vous envoyer copies de laField
instance, de sorte qu'il "oublie" après chaque fois que vous faites quelque chose commeclass.getField(name)
Mise à jour: Cette application est pour Java 8, les futures versions de changer le backend qui rompt cette. Le même concept s'applique encore si si vous voulez vraiment poursuivre cette stratégie.