Analysieren Sie zunächst die drei Rollen im dynamischen Proxy-Modell:
1. Abstrakte Rolle: Im statischen Proxy kann es sich um eine abstrakte Klasse handeln, im dynamischen Proxy jedoch nur um eine Schnittstelle
2. Echte Rolle: Es implementiert lediglich die Methoden in der abstrakten Rolle.
3. Agentenrolle: Das Ekelhafteste ist die Agentenrolle im dynamischen Agenten. Es sollte einen Bezug zum wahren Charakter enthalten.
Es umfasst eine Schnittstelle und eine Klasse, die InvocationHandler-Schnittstelle und die Proxy-Klasse. Laut JDK-Dokumentation wird die InvocationHandler-Schnittstelle von einer Klasse implementiert, und eine Instanz dieser Klasse ist das Handler-Objekt, das einem Proxy-Objekt entspricht. Wenn eine Methode des Proxy-Objekts aufgerufen wird, wird die Methode codiert und der Aufrufmethode des entsprechenden aufzurufenden Handler-Objekts zugewiesen!
Kopieren Sie den Codecode wie folgt:
//Abstrakte Rolle:
öffentliche Schnittstelle AbstractRole
{
public void show();
}
//Echter Charakter:
Die öffentliche Klasse RealRole implementiert AbstractRole
{
@Override
public void show(){ System.out.println("zeig mir dein Haus" }
}
//Agentenrolle:
//Ich denke, das ist nur ein Pseudoagent. Ich habe mir den Pseudoagenten selbst ausgedacht = =! , da es sich tatsächlich um den Handler handelt, der dem Agenten entspricht
Der öffentliche Klassenhandler implementiert InvocationHandler
{
private Object realRole; // Die Proxy-Rolle muss einen Verweis auf die reale Rolle haben. Wenn sie als Objekttyp definiert ist, ist sie universell.
öffentlicher Handler (Objekt realRole)
{ this.realRole = realRole }
@Override
öffentlicher Objektaufruf (Objekt-Proxy, Methodenmethode, Objekt[]-Argumente)
{
System.out.println("Gib mir dein Geld"); // Dies ist eine zusätzliche Funktion, die von der Agentenrolle selbst hinzugefügt wird.
method.invoke(this.realRole, args); //Methode der realen Rolle durch Reflektion aufrufen
System.out.println("Ok...Haus gehört Ihnen");//Dies ist eine zusätzliche Funktion, die von der Agentenrolle selbst hinzugefügt wird.
}
public Objectfactory()//Generieren Sie die echte Agentenrolle über die Factory-Methode
{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); //Die newProxyInstance-Methode in Proxy hat zwei sehr wichtige Funktionen! Die erste besteht darin, dynamisch eine Proxy-Klasse zu erstellen, wenn die Ausgabe eine Klasse mit dem Namen $Proxy0 zu sein scheint. Die zweite besteht darin, eine Instanz über die dynamisch erstellte Klasse zu generieren.
}
}
//Kunde:
Öffentlicher Klassentest
{
public static void main(String[] args)
{
RealRole realRole = new RealRole();//Welche reale Rolle Sie darstellen möchten, erstellen Sie einfach eine neue reale Rolle
Handler handler = new Handler(realRole);// Hier wird der der Proxy-Klasse entsprechende Handler generiert. Ich möchte ihn auch als Pseudo-Proxy-Objekt bezeichnen.
AbstractRole Proxy = (AbstractRole)handler.factory();//Generieren Sie Proxy-Objekte über Factory-Methoden
}
}
Sie fragen sich vielleicht, wie die Agentenrolle hier zwangsweise in eine abstrakte Rolle umgewandelt werden kann? Der Grund liegt in der newProxyInstance-Methode. Wie oben erwähnt, generiert sie automatisch eine Klasse und generiert dann ein Proxy-Objekt über die Klasse. Tatsächlich implementiert diese Klasse die abstrakte Rollenklasse. Denn der zweite Parameter hat bereits angegeben, welche Schnittstellen er implementiert. So können Sie die Übertragung erzwingen. Nach der erzwungenen Übertragung können Sie die Methoden in der abstrakten Rolle aufrufen.
Proxy.show();//Okay! Achten Sie auf diesen Satz, den ich am Anfang rot markiert habe: „Diese Methode wird codiert und der Aufrufmethode des entsprechenden aufzurufenden Handlerobjekts zugewiesen!“ An die Aufrufmethode im Handlerobjekt übergeben. Natürlich werden auch die Parameter der Show-Methode befolgt, aber die Show-Methode hat hier keine Parameter. Der Satz „proxy.show()“ ruft also tatsächlich die Aufrufmethode im Handlerobjekt auf.