В Java модификатор доступа private
считается безопасным, поскольку он не виден вне класса. Тогда внешний мир не знает об этом методе.
Но я думал, что отражение Java может использовать, чтобы нарушить это правило. Рассмотрим следующий случай:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Теперь из другого класса я собираюсь получить Info:
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());
}
}
В этот момент я просто подумал, что все-таки секретный метод безопасен, так как для того, чтобы сделать что-то вроде выше, мы должны знать имя метода. Но если класс, содержащий частный метод, написанный кем-то другим, у нас нет видимости этих.
Но моя точка становится недействительной после строки кода.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Теперь это method[]
содержит все, что нужно делать выше. Мой вопрос в том, есть ли способ избежать такого рода вещей, используя отражение Java?
Я процитирую некоторый пункт из Java-документации, чтобы уточнить мой вопрос.
Советы по выбору уровня доступа:
Если другие программисты используют ваш класс, вы хотите убедиться, что ошибки от неправильного использования не может случиться. Уровни доступа могут помочь вам сделать это. Используйте самый ограничительный уровень доступа, который имеет смысл для конкретного член. Используйте конфиденциальность, если у вас нет веских оснований.