Obwohl wir normalerweise denken, dass es möglich ist, über den Reflexionsmechanismus von JAVA auf private Felder und private Methoden anderer Klassen zuzugreifen, ist dies nicht so schwierig.
Hinweis: Dieser Code funktioniert nur, wenn Sie ihn in einem separaten JAVA-Programm ausführen, z. B. bei einigen Komponententests oder einem regulären Programm. Wenn Sie versuchen, diese Methode in einem JAVA-APPLET zu verwenden, müssen Sie den SecurityManager geringfügig ändern. Da man sich jedoch nicht oft damit auseinandersetzen muss, gehe ich hier nicht näher darauf ein.
Hier ist eine Liste dieser Inhalte:
1. Greifen Sie auf private Felder zu.
2. Greifen Sie auf private Methoden zu.
Auf private Felder zugreifen:
Um auf private Felder zuzugreifen, müssen Sie die Methode Class.getDeclaredField(String name) oder Class.getDeclaredFields() aufrufen. Die Methoden Class.getField(String name) und Class.getFields() geben nur gemeinsame Felder zurück und haben daher keine Auswirkung. Hier ist ein Beispiel für eine Klasse, die private Felder enthält, und unter der Klasse befindet sich Code, der durch Reflektion auf die privaten Felder zugreift.
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse PrivateObject {
private String privateString = null; //Als privates Feld deklariert
public PrivateObject(String privateString) {
this.privateString = privateString;
}
}
Kopieren Sie den Codecode wie folgt:
PrivateObject privateObject = new PrivateObject("The Private Value");//das Objekt instanziieren
Feld privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);//Zugriff auf private Felder zulassen
String fieldValue = (String) privateStringField.get(privateObject);//Den privaten Feldwert abrufen
System.out.println("fieldValue = " + fieldValue);
Dieser Code gibt den Text „fieldValue = The Private Value“ aus, der zufällig der Wert des privaten Felds privateString des Objekts PrivateObject ist.
Beachten Sie, dass wir die Methode PrivateObject.class.getDeclaredfield("privateString") verwendet haben. Es ist dieser Aufruf dieser Methode, der das private Feld zurückgibt. Diese Methode gibt nur Felder zurück, die auf der angegebenen Klasse basieren, und keine von der übergeordneten Klasse deklarierten Felder.
Schauen Sie sich auch die fettgedruckten Aussagen genau an. Durch den Aufruf von Field.setAccessible(true) deaktivieren Sie die Zugriffsprüfung für diese angegebene Feldinstanz, die nur für die Reflektion wirksam ist. Jetzt können Sie darauf zugreifen, unabhängig davon, ob es privat, geschützt oder standardmäßig ist, auch wenn sich der Anrufer nicht in diesem Bereich befindet. Sie können mit regulären Methoden immer noch nicht auf das Feld zugreifen, da der Compiler dies nicht zulässt.
Auf private Methoden zugreifen <BR>Um auf eine private Methode zuzugreifen, müssen Sie die Methode Class.getDeclaredMethod(String name,Class[] parameterTypes) oder Class.getDeclaredMethods() aufrufen. Die Methoden Class.getMethod(String name,Class[] parameterTypes) und Class.getMethods() geben nur öffentliche Methoden zurück, spielen also keine Rolle. Unten sehen Sie ein einfaches Beispiel einer Klasse mit privaten Methoden. Unterhalb der Klasse befindet sich der Code, der durch Reflektion auf die privaten Methoden zugreift.
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse PrivateObject {
privater String privateString = null;
public PrivateObject(String privateString) {
this.privateString = privateString;
}
privater String getPrivateString(){//Private Methode
return this.privateString;
}
}
Kopieren Sie den Codecode wie folgt:
PrivateObject privateObject = new PrivateObject("The Private Value");
Methode privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(true);
String returnValue = (String)
privateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);
Dieses Codebeispiel gibt den Text „returnValue = The private Value“ aus, der zufällig der Rückgabewert der privaten Methode ist.