Preciso lidar com a situação em que métodos privados são chamados através da reflexão?

12

Ao criar uma biblioteca, devo garantir que os métodos privados funcionem conforme o esperado quando chamados não por outros métodos da mesma classe, mas por outra biblioteca através da reflexão ?

Por exemplo, se um método privado private DoSomething(int number)espera que:

  • number é um número inteiro positivo diferente de zero e:
  • uma variável privada string abcnão é nula e não é uma cadeia vazia,

e completamente, feio falha se estas duas condições não são correspondidos, devo lidar com essas falhas, mesmo que eu sei que todos os métodos na classe irá always¹ atribuir um valor não-vazio para abcantes de chamar DoSomething, e passar por um diferente de zero inteiro positivo a este método?

Em outras palavras, o código que não está protegido contra chamadas não seguras por meio da reflexão pode ser considerado como código de baixa qualidade ou pertence ao chamador que usa a reflexão para garantir que a chamada não interrompa nada?

Nota: minha pergunta cobre apenas um conjunto padrão de bibliotecas. Isso não cobre o código que deve ser altamente seguro (ou seja, quando alguém pode estar interessado usando a reflexão para fazê-la se comportar inesperadamente ou travar).


¹ Como a classe está documentada corretamente, porque há testes de unidade suficientes para garantir que qualquer outro desenvolvedor não quebre esse método, etc.

Arseni Mourzenko
fonte
as classes derivadas poderão chamar os métodos privados?
Enone

Respostas:

16

Ao marcar seu método como privado, você estabeleceu suas intenções e um contrato. Ao usar a reflexão, um código do cliente pode optar por romper com este contrato e, consequentemente, terá que suportar as consequências. O mesmo acontece com os protocolos, para que as coisas funcionem regras devem ser seguidas ou coisas ruins acontecerão.

O mesmo problema pode ocorrer com outras linguagens, como C ++, nas quais vi coisas como

#define private public

Em resumo - você NÃO é obrigado a lidar com essas situações, o chamador deve saber melhor.

Otávio Décio
fonte
3
Eu já vi pessoas converterem classes para (caracteres não assinados *) e gravarem diretamente no deslocamento de memória de uma variável de membro que desejam alterar. Meus olhos sangraram.
Shawn D.
6
Eu acrescentaria que é essencialmente impossível proteger sua classe contra códigos privilegiados perigosos . Se você, de alguma forma, conseguir se proteger contra o uso inadequado da reflexão, alguém encontrará uma maneira diferente de arruinar o seu dia, possivelmente simplesmente substituindo diretamente a memória do processo. A codificação defensiva finalmente alcança um ponto de retornos decrescentes, e a reflexão está muito além desse ponto.
Aaronaught
5

Se alguém estiver usando a reflexão para chamar seus métodos particulares, é um sinal de que alguém está fazendo algo errado. Ou ele está usando o código de maneiras para as quais não foi projetado, ou você está ocultando muito do trabalho interno e diminuindo a API.

Mas parece que você ainda não está nesse estágio e está apenas tentando ser preventivo. Então, minha opinião é: não se preocupe. Um método privado deve ser considerado fora dos limites; se alguém violar deliberadamente esses limites, é problema deles se as coisas explodirem.

Mike Baranczak
fonte
0

Bem, é sempre uma boa ideia validar variáveis ​​não locais antes de usá-las, mas, além disso, eu não me preocuparia. Como os outros disseram, você estabeleceu suas intenções tornando o método privado em primeiro lugar; qualquer pessoa que ligue de fora da sua classe não tem garantias. Ao trabalhar em Java, nem coloco comentários javadoc nos meus métodos particulares, porque não quero que outros desenvolvedores saibam que eles estão lá.

TMN
fonte