En Java el private
modificador de acceso se considera seguro ya que no es visible fuera de la clase. Entonces el mundo exterior tampoco conoce ese método.
Pero pensé que la reflexión de Java puede usarse para romper esta regla. Considere el siguiente caso:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Ahora de otra clase voy a obtener información:
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());
}
}
En este momento pensé que el método privado aún era seguro, ya que para hacer algo como el anterior debemos saber el nombre del método. Pero si la clase contiene un método privado escrito por otra persona, no tenemos visibilidad de ellos.
Pero mi punto se vuelve inválido desde debajo de la línea de código.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Ahora bien, esto method[]
contiene todas las cosas que hay que hacer antes. Mi pregunta es, ¿hay alguna manera de evitar este tipo de cosas usando la reflexión de Java?
Cito algún punto de la documentación de Java para aclarar mi pregunta.
Consejos para elegir un nivel de acceso:
Si otros programadores usan su clase, querrá asegurarse de que no se produzcan errores por mal uso. Los niveles de acceso pueden ayudarlo a hacer esto. Utilice el nivel de acceso más restrictivo que tenga sentido para un miembro en particular. Use privado a menos que tenga una buena razón para no hacerlo.
getDeclaredMethods
que devolvería nombres que parecen basura.