Я использую некоторые аннотации для динамической установки значений полей в классах. Поскольку я хочу делать это независимо от того, является ли он общедоступным, защищенным или частным, я setAccessible(true)
вызываю объект Field каждый раз перед вызовом set()
метода. У меня вопрос: какое влияние этот setAccessible()
звонок оказывает на само поле?
Более конкретно, скажем, что это частное поле и этот набор кодовых вызовов setAccessible(true)
. Если бы какое-то другое место в коде предназначалось для получения того же поля посредством отражения, было бы это поле уже доступно? Или методы getDeclaredFields()
и getDeclaredField()
каждый раз возвращают новые экземпляры объекта Field?
Я предполагаю, что другой способ сформулировать вопрос: если я позвоню setAccessible(true)
, насколько важно вернуть его к исходному значению после того, как я закончу?
источник
throws Exception
также обрабатываетNoSuchFieldException
, но вы можете обработать это более сложным способом.getDeclaredField
Метод должен вернуть новый объект каждый раз, именно потому , что этот объект имеет изменяемыйaccessible
флаг. Таким образом, нет необходимости сбрасывать флаг. Вы можете найти полную информацию в этом сообщении блога .источник
Как указано на других плакатах,
setAccessible
это применимо только к этому экземпляру вашегоjava.lang.reflect.Field
, поэтому возвращать доступность в исходное состояние не требуется.Тем не мение...
Если вы хотите, чтобы ваши вызовы
field.setAccessible(true)
были постоянными, вам необходимо использовать базовые методы вjava.lang.Class
иjava.lang.reflect.Field
. Общественность облицовочных методов отправить вам копию этогоField
экземпляра, так что «забывает» после того, как каждый раз , когда вы делаете что - то вродеclass.getField(name)
Обновление : эта реализация предназначена для Java 8, будущие версии изменят бэкэнд, который нарушит это. Та же концепция по-прежнему применяется, если вы действительно хотите продолжить эту стратегию.
источник
источник