Der Inhalt dieses Artikels ist eine detaillierte Einführung (Codebeispiel) über dynamische Proxy- und Reflexionsmechanismen. Ich hoffe, dass er für Sie hilfreich ist.
Reflexionsmechanismus
Eine von der Java-Sprache bereitgestellte Grundfunktion. Durch Reflexion können wir diese Klasse oder dieses Objekt bedienen, z. B. die Methoden, Eigenschaften und Konstruktionsmethoden abrufen , usw.
Dynamischer Proxy: unterteilt in dynamischen JDK-Proxy und dynamischen cglib-Proxy (dynamischer Proxy im Frühjahr).
Statischer Proxy
Die Beziehung zwischen dem Agenten und dem Agenten wird im Voraus bestimmt (während der Kompilierung), das heißt, wenn die Agentenklasse vor dem bestimmt wird Das Programm wird ausgeführt. Diese Situation wird als statischer Proxy
dynamischer Proxy
Proxy-Klasse bezeichnet, die erstellt wird, wenn das Programm ausgeführt wird. Mit anderen Worten: Die Proxy-Klasse ist nicht im Java-Code definiert, sondern wird zur Laufzeit basierend auf unseren „Anweisungen“ im Java-Code dynamisch generiert.
Der Vorteil eines dynamischen Proxys gegenüber einem statischen Proxy ist:
Der dynamische Proxy kann die Funktionen der Proxy-Klasse bequem auf einheitliche Weise verarbeiten (aufrufen), anstatt sie einzeln zu ändern Funktion. Eine Proxy-Klassenfunktion, flexibler und erweiterbarer.
Dynamischer Proxy von JDK (abhängig von der Schnittstelle)
Im dynamischen Proxy-Mechanismus von Java gibt es zwei wichtige Klassen oder Schnittstellen, eine ist die InvocationHandler-Schnittstelle und die andere Eine davon ist die Proxy-Klasse.
Die InvocationHandler-Schnittstelle ist für die Verarbeitung der Vorgänge des Proxy-Objekts verantwortlich.
Die Proxy-Klasse wird nur dann zum Erstellen dynamischer Proxy-Klasseninstanzobjekte verwendet Objekt erhalten wird, können die erforderlichen Aufrufe der Agent-Methode erfolgen.
Die Proxy-Klasse des dynamischen Proxys wird in der statischen Proxy-Klasse geändert. Die dynamische Proxy-Klasse implementiert die InvocationHandler-Schnittstelle und überschreibt die Invoke-Methode.
Das folgende Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
cglib dynamischer Proxy (Vererbungsmethode)
MethodInterceptor wird im cglib dynamischen Proxy verwendet Erzielen Sie eine dynamische Agentenklasse.
Im Interceptor MethodInterceptor wird die Proxy-Methode von der InvokSuper-Methode von MethodProxy aufgerufen.
Die MethodProxy-Klasse generiert Proxy-Methoden und Signaturen von Proxy-Methoden.
Der Unterschied zwischen dem dynamischen JDK-Proxy und dem dynamischen Cglib-Proxy:
1. Der dynamische JDK-Proxy implementiert die Schnittstelle des Proxy-Objekts, während Cglib das Proxy-Objekt erbt.
2. Da Cglib ein Vererbungsmechanismus ist, kann es keine von final geänderten Methoden vertreten.
3. Sowohl JDK als auch Cglib schreiben Klassenbytecode direkt, während Cglib das ASM-Framework zum Schreiben von Klassenbytecode verwendet. Die Generierung von Agentenanalogen ist besser als bei JDK Low Effizienz.
4. JDK ruft Proxy-Methoden über den Reflection-Implementierungsmechanismus auf, während cglib Methoden direkt über den Fashclass-Mechanismus aufruft, was effizienter ist.
Fastcalss-Mechanismus:
Generieren Sie eine Klasse für die Proxy-Klasse und die Proxy-Klasse. Diese Klasse weist der Methode der Proxy-Klasse oder der Proxy-Klasse einen Index zu .
Dieser Index wird als Eingabeparameter verwendet, und Fashclass kann die aufzurufende Methode direkt finden und direkt aufrufen. Dadurch entfallen Reflexionsaufrufe und es ist äußerst effizient.
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den dynamischen Proxy- und Reflexionsmechanismus in Java (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!