У 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
поверне імена, схожі на сміття.