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