Estoy usando algunas anotaciones para establecer dinámicamente valores de campos en clases. Como quiero hacer esto independientemente de si es público, protegido o privado, estoy llamando setAccessible(true)
al objeto Field cada vez antes de llamar al set()
método. Mi pregunta es ¿qué tipo de impacto tiene la setAccessible()
convocatoria en el campo mismo?
Más específicamente, digamos que es un campo privado y este conjunto de llamadas de código setAccessible(true)
. Si algún otro lugar en el código fuera a recuperar el mismo campo a través de la reflexión, ¿el campo ya sería accesible? ¿O los métodos getDeclaredFields()
y getDeclaredField()
devuelven nuevas instancias de un objeto Field cada vez?
Supongo que otra forma de plantear la pregunta es, si llamo setAccessible(true)
, ¿qué importancia tiene volver al valor original cuando termine?
fuente
throws Exception
también manejaNoSuchFieldException
, pero es posible que desee manejarlo de una manera más elaborada.El
getDeclaredField
método tiene que devolver un nuevo objeto cada vez, exactamente porque este objeto tiene laaccessible
bandera mutable . Por tanto, no es necesario restablecer la bandera. Puede encontrar los detalles completos en esta publicación de blog .fuente
Como han indicado otros carteles,
setAccessible
solo es aplicable a esa instancia de sujava.lang.reflect.Field
, por lo que no es necesario volver a configurar la accesibilidad a su estado original.Sin embargo...
Si desea que sus llamadas
field.setAccessible(true)
sean persistentes, debe utilizar métodos subyacentes enjava.lang.Class
yjava.lang.reflect.Field
. Los métodos públicos le envían copias de laField
instancia, por lo que se "olvida" cada vez que hace algo comoclass.getField(name)
Actualización : esta implementación es para Java 8, las versiones futuras cambian el backend que rompe esto. El mismo concepto todavía se aplica aunque realmente desee continuar con esta estrategia.
fuente
fuente