Reflection é uma desvantagem já que as variáveis privadas não podem ser restringidas?

14

O modificador private é usado para restringir o acesso fora da classe, mas usando reflexão outras classes podem acessar métodos e campos privados. Então, eu estou querendo saber como podemos restringir a acessibilidade se for parte do requisito.

    
por user245930 13.09.2016 / 11:37
fonte

6 respostas

54

O propósito dos modificadores de acesso é informar aos desenvolvedores que escrevem código sobre o que é a interface pública de uma classe. Eles não são de forma alguma uma medida de segurança e não ocultam ou protegem literalmente qualquer informação.

    
por 13.09.2016 / 12:53
fonte
31

Para citar Herb Sutter sobre direitos de acesso a turmas :

"A questão aqui é proteger contra Murphy contra a proteção contra Maquiavel ... ou seja, proteger contra o uso indevido acidental (que a linguagem faz muito bem) contra a proteção contra o abuso deliberado (que é efetivamente impossível). fim, se um programador quiser o suficiente para subverter o sistema, ele encontrará uma maneira "

    
por 13.09.2016 / 14:42
fonte
9

Não, isso é realmente uma vantagem importante. Simplesmente porque algum desenvolvedor não considerou que alguém precisaria acessar alguma parte do estado interno, não significa que nenhum caso de uso legítimo apareça. Nesses casos, o uso do Reflection para realizar uma cirurgia em um objeto pode ser um último recurso. Eu tive que usar essa técnica mais de uma vez.

    
por 13.09.2016 / 11:57
fonte
4

Você restringe ainda mais a acessibilidade, subindo mais um nível: o ambiente de execução.

Nem todas as linguagens têm esse conceito, mas pelo menos com Java você pode usar um gerenciador de segurança que proíbe a disponibilização de campos privados. Você pode instalar manualmente o gerenciador de segurança em tempo de execução ou adicionar uma política de segurança em um arquivo jar que é então lacrado para impedir a modificação.

Mais informações sobre como fazer isso em Java: Segurança de reflexão

    
por 13.09.2016 / 18:53
fonte
3

Qual reflexão você está falando?

Em muitos sistemas de reflexão, contornar o encapsulamento é uma capacidade explícita que seu código precisa obter e não tem por padrão.

Se você está preocupado com o encapsulamento, a solução simples é simplesmente não usar um sistema de reflexão que não o preserve.

    
por 13.09.2016 / 12:23
fonte
3

No Python, não há modificadores de acesso. A convenção é prefixar por um sublinhado os métodos e variáveis que não devem ser acessados de fora da classe. Isso impede tecnicamente que você acesse esse campo de uma classe de terceiros? De modo nenhum; mas se você fizer isso, estará sozinho e correrá o risco de quebrar alguma coisa, sem ser capaz de culpar a outra classe.

Em C #, existem modificadores de acesso, mas eles ainda são apenas uma convenção - um que é imposto por um compilador, mas ainda assim uma convenção. Isso significa que, tecnicamente, ainda é possível acessar e alterar variáveis privadas, seja por meio do Reflection ou por meio de adulteração direta da memória (como treinadores de jogos ). A conseqüência é exatamente a mesma: se as variáveis de sua classe são alteradas através do Reflection de outra classe, ou através de adulteração de memória por outro aplicativo, e isso quebra algo em sua classe, não é sua culpa.

Observe que isso, obviamente, cria problemas de segurança nos quais um terceiro pode acessar seus dados; algo que leva a variantes criptografadas de uma string e estruturas de dados semelhantes. Mas proteger seu código contra esse uso é um sistema operacional mais relacionado e restrições de acesso no nível de código e não tem nada a ver com Reflexão em si.

    
por 13.09.2016 / 13:45
fonte