Estou usando algumas anotações para definir dinamicamente os valores dos campos nas classes. Como desejo fazer isso independentemente de ser público, protegido ou privado, estou sempre chamando setAccessible(true)
o objeto Field antes de chamar o set()
método. Minha pergunta é que tipo de impacto a setAccessible()
chamada tem no campo em si?
Mais especificamente, digamos que seja um campo privado e este conjunto de chamadas de código setAccessible(true)
. Se algum outro lugar no código fosse então recuperar o mesmo campo por meio de reflexão, o campo já estaria acessível? Ou os métodos getDeclaredFields()
e getDeclaredField()
retornam novas instâncias de um objeto Field a cada vez?
Acho que outra forma de colocar a questão é: se eu ligar setAccessible(true)
, qual a importância de voltar ao valor original depois de terminar?
fonte
throws Exception
também controlaNoSuchFieldException
, mas você pode querer lidar com isso de uma forma mais elaborada.O
getDeclaredField
método deve retornar um novo objeto a cada vez, exatamente porque esse objeto possui oaccessible
flag mutável . Portanto, não há necessidade de redefinir o sinalizador. Você pode encontrar os detalhes completos nesta postagem do blog .fonte
Como outros pôsteres indicaram,
setAccessible
é aplicável apenas a essa instância do seujava.lang.reflect.Field
, portanto, não é necessário definir a acessibilidade de volta ao seu estado original.Contudo...
Se você deseja que suas chamadas
field.setAccessible(true)
sejam persistentes, você precisa usar métodos subjacentes emjava.lang.Class
ejava.lang.reflect.Field
. Os métodos voltados para o público enviam cópias daField
instância, então ela "esquece" cada vez que você faz algo comoclass.getField(name)
Atualização : esta implementação é para Java 8, versões futuras mudam o backend que quebra isso. O mesmo conceito ainda se aplica, se você realmente quiser continuar com essa estratégia.
fonte
fonte