Lorsque nous devons appeler une méthode d'une certaine classe (classe d'implémentation spécifique), nous ne créons pas directement un objet de la classe, mais obtenons l'objet de classe proxy de la classe et appelons l'implémentation spécifique. classe via la fonction d’objet proxy. La classe d'implémentation concrète et la classe proxy implémentent la même interface, et la classe proxy contient l'objet de la classe d'implémentation. Cela crée une couche d'isolement entre l'extrémité appelante et l'extrémité d'implémentation spécifique pour éviter une interaction directe.
Il existe de nombreux exemples similaires du modèle d'agence dans la réalité. Par exemple, lorsque nous achetons ou louons une maison, nous devons passer par un intermédiaire.
1) Définir l'interface :
public interface IHouse { void sallHouse(); int sallHouse2(); }
2) Classe d'implémentation spécifique :
public class Andy implements IHouse { @Override public void sallHouse() { System.out.println("andy sall house.."); } @Override public int sallHouse2() { return 100; } }
3) Classe proxy :
public class HouseProxy implements IHouse { Andy andy; public HouseProxy(Andy andy) { this.andy = andy; } @Override public void sallHouse() { andy.sallHouse(); } @Override public int sallHouse2() { return andy.sallHouse2(); } }
4) Appel client :
//1.创建被代理对象 Andy andy = new Andy(); //2.创建代理对象,代理对象持有被代理对象的引用 HouseProxy proxy = new HouseProxy(andy); //3.客户端通过代理对象调用。 proxy.sallHouse();
1) IHouse iHouse = (IHouse) Proxy.newProxyInstance();
Créez un objet proxy dynamique,
a trois paramètres : IHouse iHouse = (IHouse) Proxy.newProxyInstance();
创建动态代理对象,
有三个参数:
1.ClassLoader 类加载器
2.被代理接口的Class类,
3.InvocationHandler接口实现类
2)拿到iHouse动态代理后,调用接口的方法iHouse.sallHouse();
这个方法一被调用,就会执行InvocationHandler类中invoke方法。
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
//通过反射调用被代理对象的方法
return method.invoke(andy, objects);
}
invoke方法有三个参数:
method,就是代理类调用的方法名(sallHouse)
objects,就是代理类调用方法时传递的参数。
Object obj = method.invoke(andy, objects);
🎜@Override🎜🎜public Object Invoquer (Object o, Méthode méthode, Objet [] objets) lance Throwable {🎜🎜//Invoquer la méthode de l'objet proxy par réflexion🎜🎜return method.invoke(andy, objets ) ;🎜🎜}🎜🎜La méthode d'invocation a trois paramètres : 🎜🎜method, qui est le nom de la méthode appelée par la classe proxy (sallHouse) 🎜🎜objects, qui sont les paramètres passés lorsque la classe proxy appelle le méthode. 🎜🎜
Object obj = method.invoke(andy, objects);
Invoquez l'objet andy via le mécanisme de réflexion, la méthode correspondante dans l'implémenteur spécifique. 🎜🎜Sa valeur de retour peut être reçue lorsque l'objet proxy appelle l'interface. Quel que soit son type, ce type sera renvoyé. C'est ce que fait Retrofit🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!