W Javie private
modyfikator dostępu uważa się za bezpieczny, ponieważ nie jest widoczny poza klasą. Wtedy świat zewnętrzny również nie wie o tej metodzie.
Ale pomyślałem, że odbicie w Javie może użyć do złamania tej reguły. Rozważ następujący przypadek:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Teraz z innej klasy otrzymam informacje:
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());
}
}
W tej chwili uważałem, że nadal prywatna metoda jest bezpieczna, ponieważ aby zrobić coś takiego jak powyżej, musimy znać nazwę metody. Ale jeśli klasa zawiera metody prywatne napisane przez kogoś innego, nie mamy ich widoczności.
Ale mój punkt stał się nieważny, ponieważ poniższy wiersz kodu.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Teraz method[]
zawiera wszystkie rzeczy, które należy zrobić powyżej. Moje pytanie brzmi: czy istnieje sposób na uniknięcie tego rodzaju działań przy użyciu odbicia w języku Java?
Cytuję pewien punkt z dokumentacji Java, aby wyjaśnić moje pytanie.
Wskazówki dotyczące wyboru poziomu dostępu:
Jeśli inni programiści używają Twojej klasy, chcesz mieć pewność, że błędy wynikające z niewłaściwego użycia nie wystąpią. Poziomy dostępu mogą ci w tym pomóc. Użyj najbardziej restrykcyjnego poziomu dostępu, który ma sens dla konkretnego członka. Użyj prywatnego, chyba że masz dobry powód, aby tego nie robić.
getDeclaredMethods
zwróci nazwy, które wyglądają jak śmieci.