In Java gilt der private
Zugriffsmodifikator als sicher, da er außerhalb der Klasse nicht sichtbar ist. Dann weiß die Außenwelt auch nichts über diese Methode.
Aber ich dachte, Java Reflection kann diese Regel brechen. Betrachten Sie folgenden Fall:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Jetzt werde ich von einer anderen Klasse Info bekommen:
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());
}
}
In diesem Moment dachte ich nur, dass private Methoden noch sicher sind, da wir den Methodennamen kennen müssen, um etwas wie oben zu tun. Aber wenn Klassen, die private Methoden enthalten, die von jemand anderem geschrieben wurden, haben wir keine Sichtbarkeit dieser.
Aber mein Punkt wird ungültig, da unter der Codezeile.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Dies method[]
enthält nun alle Dinge, die oben zu tun sind. Meine Frage ist, gibt es eine Möglichkeit, solche Dinge mit Java Reflection zu vermeiden?
Ich zitiere einen Punkt aus der Java-Dokumentation , um meine Frage zu klären.
Tipps zur Auswahl einer Zugriffsebene:
Wenn andere Programmierer Ihre Klasse verwenden, möchten Sie sicherstellen, dass keine Fehler durch Missbrauch auftreten können. Zugriffsebenen können Ihnen dabei helfen. Verwenden Sie die restriktivste Zugriffsebene, die für ein bestimmtes Mitglied sinnvoll ist. Verwenden Sie privat, es sei denn, Sie haben einen guten Grund, dies nicht zu tun.
getDeclaredMethods
Namen zurückgegeben werden, die wie Müll aussehen.