Der Proxy -Modus verwendet das Proxy -Objekt, um die Anforderung des Benutzers zu vervollständigen und den Zugriff des Benutzers auf das reale Objekt zu blockieren.
Der Proxy -Modus hat viele Verwendungszwecke, z. B. aus Sicherheitsgründen, es ist erforderlich, den Kunden daran zu hindern, direkt auf das reale Objekt zuzugreifen. oder in Remote -Aufrufen muss das Proxy -Objekt verwendet werden, um technische Details in der Remote -Methode zu verarbeiten. Um das System zu verbessern, wird das reale Objekt eingekapselt, um den Zweck einer verzögerten Belastung zu erreichen.
Wenn das System beginnt, kann die Trennung der Methode, die die meisten Ressourcen mit dem Proxy -Modus konsumiert, die Startgeschwindigkeit des Systems beschleunigen und die Wartezeit des Benutzers verkürzen. Wenn der Benutzer tatsächlich Abfrage durchführt, lädt die Proxy -Klasse die reale Klasse, um die Benutzeranforderung abzuschließen. Dies ist der Zweck der Verwendung des Proxy -Modus, um fauler Laden zu erreichen.
1. Statische Proxy -Implementierung:
Themenschnittstelle:
public interface idbQuery {String request (); } Echtes Thema:
public class dBQuery implementiert idbQuery {public dBQuery () {try {thread.sleep (10000); } catch (Ausnahme e) {e.printstacktrace (); }} public String request () {return "String request"; }} Proxy -Klasse:
public class idbQueryProxy implementiert idbQuery {private dBQuery dBQuery; public String request () {if (dbQuery == null) dBQuery = new dbQuery (); return dBQuery.request (); }} Schließlich die Hauptfunktion:
public class ProxyText {public static void main (String [] args) {idbQuery dbQuery = new idBQueryProxy (); System.out.println (dbquery.request ()); }}Static Proxy beachten, dass die Proxy-Klasse eine gemeinsame Schnittstelle für reale Klassen ist, und die Proxy-Klasse bezieht sich auf reale Klassenobjekte und setzt zeitaufwändige Vorgänge in die Proxy-Klassenmethode zur Implementierung.
Dynamischer Proxy:
Dynamic Proxy ist beim Ausführen und generiert dynamisch Proxy -Klassen. Das heißt, der Bytecode der Proxy -Klasse wird zur Laufzeit generiert und geladen. Im Vergleich zu statischen Wirkstoffen müssen dynamische Wirkstoffe nicht darauf achten, eine vollständig identische Einkapselungsklasse für den eigentlichen Zweck zu verkapulieren. Wenn es viele Themenoberflächen gibt, ist es ärgerlich, für jede Schnittstelle eine Proxy -Methode zu schreiben. Wenn sich die Schnittstelle ändert, müssen sowohl die reale Klasse als auch die Proxy -Klasse geändert werden, was der Systemwartung nicht förderlich ist. Zweitens können die Erzeugungsmethoden einiger dynamischer Wirkstoffe sogar zur Laufzeit ausgeführt werden, was eine spezifizierte Ausführungslogik der Proxy -Klasse darstellt, wodurch die Flexibilität des Systems erheblich verbessert wird.
Themenschnittstelle:
public interface idbQuery {String request (); } JDK -Proxy -Klasse:
public class jdbdbQueryHandler implementiert invocationHandler {idbQuery idbQuery = null; @Override Public Object Invoke (Object Proxy, Methode Methode, Object [] args) löscht Throwable {if (idBQuery == null) {idBQuery = new DBQuery (); } return idbQuery.request (); } public static idbQuery createjdbProxy () {idbQuery jdkproxy = (idbQuery) proxy.newproxyInstance (classloader.getSystemClassloader (), new class [] {idbQuery.class}, new jdbdbqueryHandler (); System.out.println ("jdbdbQueryHandler.createjdbproxy ()"); Return Jdkproxy; }} Hauptfunktion:
public class ProxyText {public static void main (string [] args) {idbQuery idbQuery = jdbdbQueryHandler.createjdbproxy (); System.out.println (idbQuery.request ()); }}Darüber hinaus können Sie CGGLIB und Javassist Dynamic Proxy als JDK-Dynamikproxy ähneln, aber der Erstellungsprozess der JDK-Dynamikklasse ist die schnellste, da die integrierte DiffineClass () -Methode als native Implementierung definiert ist, sodass seine Leistung besser als andere ist. In den Funktionsaufrufen von Proxy -Klassen ist der dynamische Proxy von JDK nicht so gut wie CGlib und Javassist Dynamic Proxy, während Javassist Dynamic Proxy die schlechteste Leistungsqualität hat und noch schlechter ist als die Implementierung von JDK. In den tatsächlichen Entwicklungsanwendungen ist die Methode, die die Häufigkeit der Proxy -Klasse aufruft, viel höher als die tatsächliche Erzeugungsfrequenz der Proxy -Klasse, sodass die Methode, die die Leistung von dynamischem Proxy nennt, zum Schwerpunkt der Leistung werden sollte. JDK Dynamic Proxy schreibt vor, dass Proxy -Klassen und reale Themen einheitliche Schnittstellen implementieren, und CGGLIB und Javassist Dynamic Proxy haben keine solchen Anforderungen.
In Java beinhaltet die Implementierung von dynamischem Proxy die Verwendung von Classloader. Als Beispiel wird eine kurze Beschreibung des Ladevorgangs dynamischer Klassen beschrieben. Mit CGGLIB zum Generieren dynamischer Proxy müssen Sie zunächst eine Instanz der Enhancer -Klasse generieren und eine Rückrufklasse für die Bearbeitung von Proxy -Geschäft formulieren. Bei der Methode Enhancer.create () wird die Bytecode der Proxy -Klasse unter Verwendung der Standard -AnGeneratorStrategy.Generate () -Methode erzeugt und im Byte -Array gespeichert. Rufen Sie dann reflectUtils.DefineClass () -Methoden auf und rufen Sie durch Reflexion Classloader.DefineClass () -Methode auf, um die Bytecode in den Klassenloader zu laden, um das Laden der Klasse zu vervollständigen. Schließlich wird durch Reflectils.NewinStance () -Methode eine dynamische Klasseninstanz durch Reflexion erzeugt und die Instanz wird zurückgegeben. Andere unterscheiden sich von den Prozessdetails, aber die Generationslogik ist gleich.
Das Obige dreht sich alles um diesen Artikel, ich hoffe, es wird für das Lernen aller hilfreich sein.