动态代理
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期间(Runtime)实现动态关联
java动态代理主要是使用java.lang.reflect包中的两个类
InvocationHandler类
public Object invoke (Object obj,Method method,Object[] obs)
其中第一个参数obj值的是代理类,method是被代理的方法,obs是指被代理的方法的参数,此方法由代理类来实现。
Proxy类
protected Proxy(InvocatonHandler h)
static Class getProxyClass(ClassLoader loader,Class[]interfaces,InvocationHandler h)
动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后告诉他class已经实现了这些interface,而是在生成Proxy的时候,必须给他提供一个handler,让他自己来接管实际的工作
package com.lili.proxy2; import org.junit.Test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author: QiJingJing * @create: 2021/7/15 */ public class Test1 { public static void main(String[] args) { // 用来创建代理对象的对象 CreateProxy createProxy = new CreateProxy(); // Subject person = new Person(); // Subject proxy = (Subject) createProxy.creat // (person); // proxy.shopping(); Subject2 person1 = new Person(); Subject2 proxy1 = (Subject2) createProxy.creat(person1); proxy1.flay(); } } interface Subject { /** * 去购物 */ void shopping(); } interface Subject2 { /** * 去坐飞机 */ void flay(); } /** * 被代理类 */ class Person implements Subject, Subject2 { @Override public void shopping() { System.out.println("付款,买到心仪的比基尼"); } @Override public void flay() { System.out.println("付款,已经坐上飞机"); } } /** * 用于动态生成一个代理对象的类 */ class CreateProxy implements InvocationHandler { private Object target;//被代理对象 /** * 用于创建代理对象的方法 */ public Object creat(Object target) { this.target = target; Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); return proxy; } /** * 代理对象要执行的方法 * * @param proxy 代理类对象 * @param method 被代理对象的方法 * @param args 被代理对象的参数 * @return: java.lang.Object * @author: QijingJing * @date: 2021/7/15 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("上海外寻找客户需要的产品"); System.out.println("跟客户确定物品"); method.invoke(target, args); System.out.println("完成本次海淘"); // 无返回值 return null; } }