В 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
будет возвращать имена, которые выглядят как мусор. - person Sergey Kalinichenko   schedule 08.11.2013private
. Затем модификаторprivate
становится Программистам не нужно и не следует знать об этом. Системные службы могут, но программисты должны только настраивать их для взаимодействия с ними. Предположим, вы пытаетесь использовать программирование без получения, используяName.appendFullName(Appendable)
вместоName.getGivenName()
иName.getSurName()
. Вы по-прежнему можете использовать Hibernate для полученияName
объектов из базы данных. - person Eric Jablow   schedule 13.11.2013