Em Java, o private
modificador de acesso é considerado seguro, pois não é visível fora da classe. Então, o mundo exterior também não conhece esse método.
Mas eu pensei que a reflexão Java pode ser usada para quebrar essa regra. Considere o seguinte caso:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Agora de outra aula vou obter informações:
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
Neste momento eu apenas pensei que o método privado ainda era seguro, pois para fazer algo como acima, devemos saber o nome do método. Mas se a classe contém método privado escrito por outra pessoa, não temos visibilidade deles.
Mas meu ponto se tornou inválido por estar abaixo da linha de código.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Agora, isso method[]
contém todas as coisas que você precisa fazer acima. Minha pergunta é: há uma maneira de evitar esse tipo de coisa usando o reflexo Java?
Estou citando algum ponto da documentação Java para esclarecer minha dúvida.
Dicas para escolher um nível de acesso:
Se outros programadores usam sua classe, você deseja garantir que erros de uso indevido não aconteçam. Os níveis de acesso podem ajudá-lo a fazer isso. Use o nível de acesso mais restritivo que faça sentido para um determinado membro. Use privado, a menos que você tenha um bom motivo para não o fazer.
getDeclaredMethods
retornaria nomes que parecem lixo.