Analysez d’abord les trois rôles dans le modèle de proxy dynamique :
1. Rôle abstrait : dans un proxy statique, il peut s'agir d'une classe abstraite, mais dans un proxy dynamique, il ne peut s'agir que d'une interface.
2. Rôle réel : il implémente simplement les méthodes dans le rôle abstrait.
3. Rôle d'agent : La chose la plus dégoûtante est le rôle d'agent dans l'agent dynamique. Il doit contenir une référence au personnage réel.
Il implique une interface et une classe, l'interface InvocationHandler et la classe Proxy. Selon la documentation du JDK, l'interface InvocationHandler est implémentée par une classe, et une instance de cette classe est l'objet gestionnaire correspondant à un objet proxy. Lorsqu'une méthode de l'objet proxy est appelée, la méthode sera codée et affectée à la méthode d'invocation de son objet gestionnaire correspondant à appeler !
Copiez le code comme suit :
//Rôle abstrait :
interface publiqueRésuméRôle
{
spectacle vide public ();
}
//Vrai personnage :
la classe publique RealRole implémente AbstractRole
{
@Outrepasser
public void show(){ System.out.println("montre-moi ta maison" }
}
//Rôle d'agent :
//Je pense que ce n'est qu'un pseudo-agent. J'ai inventé le pseudo-agent moi-même = = ! , car il s'agit en fait du handler correspondant à l'agent
Le gestionnaire de classe publique implémente InvocationHandler
{
private Object realRole; // Le rôle proxy doit avoir une référence au rôle réel S'il est défini comme type Object, il est universel.
Gestionnaire public (objet realRole)
{ this.realRole = realRole ;
@Outrepasser
appel d'objet public (proxy d'objet, méthode de méthode, arguments Object[])
{
System.out.println("Donnez-moi votre argent"); // Il s'agit d'une fonction supplémentaire ajoutée par le rôle d'agent lui-même.
method.invoke(this.realRole, args); //Invoque la méthode du rôle réel par réflexion
System.out.println("Ok...la maison est à vous");//Il s'agit d'une fonction supplémentaire ajoutée par le rôle d'agent lui-même.
}
public Object factory()//Générer le rôle d'agent réel via la méthode factory
{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); //La méthode newProxyInstance dans Proxy a deux fonctionnalités très importantes ! La première consiste à créer dynamiquement une classe proxy, si la sortie semble être une classe nommée $Proxy0 ; la seconde consiste à générer une instance via la classe créée dynamiquement.
}
}
//Client:
Test de classe publique
{
public static void main (String[] arguments)
{
RealRole realRole = new RealRole();//Quel rôle réel vous souhaitez représenter, créez simplement un nouveau rôle réel
Handler handler = new Handler(realRole);//Le gestionnaire correspondant à la classe proxy est généré ici. Je veux aussi l'appeler un objet pseudo-proxy.
AbstractRole proxy = (AbstractRole)handler.factory();//Générer des objets proxy via des méthodes d'usine
}
}
Vous vous demandez peut-être comment le rôle d’agent peut ici être converti de force en un rôle abstrait ? La raison réside dans la méthode newProxyInstance. Cette méthode est trop intéressante, comme mentionné ci-dessus, elle générera automatiquement une classe puis générera un objet proxy via la classe. En fait, cette classe implémente la classe de rôle abstraite Pourquoi ? Parce que le deuxième paramètre a déjà spécifié quelles interfaces il implémente. Vous pouvez donc forcer le transfert. Après le transfert forcé, vous pouvez appeler les méthodes dans le rôle abstrait.
proxy.show();//D'accord ! Faites attention à cette phrase. Je l'ai marquée en rouge au début : "Cette méthode sera codée et assignée à la méthode d'invocation de son objet gestionnaire correspondant à appeler. À cause de cette phrase, proxy.show() La méthode show est !" transmis à la méthode Invoke dans l'objet gestionnaire. Bien sûr, les paramètres de la méthode show sont également suivis, mais la méthode show n'a ici aucun paramètre. Ainsi, la phrase proxy.show() appelle en fait la méthode d'invocation dans l'objet gestionnaire.