J'utilise des annotations pour définir dynamiquement les valeurs des champs dans les classes. Puisque je veux faire cela indépendamment du fait que ce soit public, protégé ou privé, je fais un appel setAccessible(true)
sur l'objet Field à chaque fois avant d'appeler la set()
méthode. Ma question est de savoir quel genre d'impact cet setAccessible()
appel a-t-il sur le terrain lui-même?
Plus précisément, disons qu'il s'agit d'un champ privé et que cet ensemble d'appels de code setAccessible(true)
. Si un autre endroit du code devait alors récupérer le même champ par réflexion, le champ serait-il déjà accessible? Ou les méthodes getDeclaredFields()
and getDeclaredField()
renvoient-elles à chaque fois de nouvelles instances d'un objet Field?
Je suppose qu'une autre façon de poser la question est de savoir si j'appelle setAccessible(true)
, à quel point est-il important de le remettre à sa valeur d'origine après avoir terminé?
la source
throws Exception
gère égalementNoSuchFieldException
, mais vous voudrez peut-être le gérer d'une manière plus élaborée.La
getDeclaredField
méthode doit retourner un nouvel objet à chaque fois, exactement parce que cet objet a l'accessible
indicateur mutable . Il n'est donc pas nécessaire de réinitialiser le drapeau. Vous pouvez trouver tous les détails dans cet article de blog .la source
Comme d'autres affiches l'ont indiqué,
setAccessible
ne s'applique qu'à cette instance de votrejava.lang.reflect.Field
, il n'est donc pas nécessaire de rétablir l'accessibilité à son état d'origine.Toutefois...
Si vous souhaitez que vos appels
field.setAccessible(true)
soient persistants, vous devez utiliser des méthodes sous-jacentes dansjava.lang.Class
etjava.lang.reflect.Field
. Les méthodes accessibles au public vous envoient des copies de l'Field
instance, de sorte qu'elle «oublie» chaque fois que vous faites quelque chose commeclass.getField(name)
Mise à jour : Cette implémentation est pour Java 8, les futures versions changent le backend qui rompt cela. Le même concept s'applique toujours si vous souhaitez vraiment continuer cette stratégie.
la source
la source