In diesem Artikel wird hauptsächlich das Implementierungsprinzip der Java-Methodenreflexion ausführlich vorgestellt, das einen gewissen Referenzwert hat.
Der Blogger sagte: Der Java-Reflexionsmechanismus ist Im laufenden Zustand können Sie für jede Klasse alle Eigenschaften und Methoden dieser Klasse kennen und jede ihrer Methoden und Eigenschaften aufrufen wird als Reflexionsmechanismus der Java-Sprache bezeichnet. In diesem Artikel analysiert Zhan Xiaolang das Implementierungsprinzip (Quellcode) des Java-Reflexionsmechanismus. Interessierte Schüler können diesen Artikel einige Minuten lang lesen, um ihn zu verstehen.
Text
Methodenreflexionsinstanzpublic class ReflectCase { public static void main(String[] args) throws Exception { Proxy target = new Proxy(); Method method = Proxy.class.Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode("run"); method.Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode(target); } static class Proxy { public void run() { System.out.println("run"); } } }
Method Get
Rufen Sie Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode der Class-Klasse auf, um das Methodenobjekt Method mit dem angegebenen Methodennamen und den angegebenen Parametern abzurufen.Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode
Die Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Methode ruft die Liste der in der Klasse deklarierten Methoden aus dem Cache oder der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode und der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Methode ab gibt zurück. Suchen Sie nach einem Methodenobjekt, das dem Namen und den Parametern in der Methodenliste entspricht.Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode
Wenn eine passende Methode gefunden wird, wird eine neue Kopie zurückgegeben, also die-Methode. Method.copy()
Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode
Rufen Sie die Liste der in dieser Klasse deklarierten Methoden aus dem Cache oder der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode ab. Die Implementierung ist wie folgt: Die Methode „Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode()“ wird wie folgt implementiert: Hier gibt es eine wichtigere Datenstruktur ReflectionData, die zum Zwischenspeichern der folgenden Attributdaten von verwendet wird Die aus der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode gelesene Klasse: Aus der Implementierung der ReflectionData()-Methode ist ersichtlich, dass das ReflectionData-Objekt vom Typ SoftReference ist, was darauf hinweist, dass es recycelt werden kann Wenn der Speicher knapp ist, kann dies jedoch auch über den Parameter -XX:SoftRefLRUPolicyMSPerMB gesteuert werden. Zum Zeitpunkt des Recyclings wird es recycelt, solange GC auftritt. Wenn ReflectionData recycelt und die Reflection-Methode ausgeführt wird, dann ein solches Objekt kann nur über die Methode Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode neu erstellt werden. Die Methode Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode wird wie folgt implementiert: Setzen Sie das ReflectionData-Feld über die Methode „unsafe.compareAndSwapObject“ zurück. Wenn das über ReflectionData () erhaltene ReflectionData-Objekt nicht leer ist, versuchen Sie, die deklarierteMethods-Eigenschaft vom ReflectionData-Objekt abzurufen. Wenn es sich um Once handelt oder wenn das neu initialisierte Klassenattribut nach der Wiederverwertung durch GC leer ist, müssen Sie es abrufen erneut aus der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode und weisen Sie sie ReflectionData zu. Die zwischengespeicherten Daten können beim nächsten Aufruf verwendet werden.Methodenaufrufe
Nachdem Sie die angegebene Methodenobjektmethode erhalten haben, können Sie deren Aufrufmethode wie folgt aufrufen: Es ist zu beachten, dass das Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Objekt hier der Schlüssel zur Implementierung der Invoke-Methode ist. Zunächst ist der methodAccessor leer und Sie müssen acquireDetaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode aufrufen, um ein neues Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Objekt zu generieren selbst ist eine Schnittstelle, die wie folgt implementiert ist:In der acquireDetaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Methode wird ein Objekt, das die Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Schnittstelle implementiert, über newDetaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode der ReflectionFactory-Klasse erstellt lautet wie folgt:
In der ReflectionFactory-Klasse gibt es zwei wichtige Felder: noInflation (Standardwert falsch) und inflationThreshold (Standardwert 15). In der checkInitted-Methode können Sie -Dsun.reflect.inflationThreshold=xxx und -Dsun.reflect.noInflation= übergeben true Setzen Sie diese beiden Felder zurück und legen Sie sie nur einmal fest. Wenn noInflation false ist, gibt die Methode newDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl das DelegatingDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekt zurück:
Tatsächlich DelegatingDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekt Es ist ein Proxy-Objekt, das für den Aufruf der Invoke-Methode des Delegaten des delegierten Objekts verantwortlich ist. Der Delegate-Parameter ist derzeit ein NativeDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekt, daher ruft die Invoke-Methode der letzten Methode die Invoke-Methode des NativeDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekts auf :
Der inflationThreshold in der ReflectionFactory-Klasse wird hier verwendet. Nachdem der Delegat die Aufrufmethode 15 Mal aufgerufen hat, wird das Detaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekt über die genericMethod generiert Methode der Detaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeGenerator-Klasse und als Delegate-Objekt festgelegt, sodass die Methode beim nächsten Aufruf ausgeführt wird, wird die Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode()-Methode des neu erstellten Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Objekts aufgerufen. Hier ist zu beachten, dass die Methode „generateMethod“ beim Generieren eines Detaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekts den entsprechenden Bytecode im Speicher generiert und ClassDefiner.defineClass aufruft, um das entsprechende Klassenobjekt zu erstellen. Die Implementierung lautet wie folgt:
In der Implementierung der ClassDefiner.defineClass-Methode wird bei jedem Aufruf ein Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Klassenladeobjekt generiert:
Eine neue Klasse Der Loader wird hier jedes Mal generiert. Aus Leistungsgründen können diese generierten Klassen in einigen Fällen entladen werden, da das Entladen von Klassen nur dann recycelt werden kann, wenn der ursprüngliche Klassenlader verwendet wird Dies kann dazu führen Diese neu erstellten Klassen sollen niemals entladen werden. Aus gestalterischer Sicht möchten wir nicht, dass diese Klassen immer im Speicher vorhanden sind.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!