动态代理
动态代理就是通过代理类(Proxy)的代理,使接口和实现类之间不发生直接关系,而在运行期实现动态关联。
InvocationHandle类
public Object invoke(Object obj,Method method,Object [] obs),其中第一个参数obj指的是代理类,method是代理的方法,obs是指被代理的方法的参数数组。此方法由代理类实现。
Proxy类
Protected Proxy(InvocationHandle h)
static Class getProxyClass(ClassLoader loader,Class [] interface)
static Object newProxyInstance(ClassLoader loader,Class [] interface,InvocationHandle h)
动态代理是在运行时生成class,所以我们需要提供一组interface,然后告诉他class已经实现这些interface。在生成Proxy的同时,需要提供一个handle,让他接管实际的工作。
动态代理实现步骤:
(1)创建接口
public interface Subject { public void shopping(); }
(2)创建 被代理类
public class Person implements Subject{ @Override public void shopping() { System.out.println("付款,买到商品"); } }
(3)创建代理
/* 该类用来动态生成一个代理对象 */ public class CreateProxy implements InvocationHandler { //被代理的目标对象 private Object target; //创建代理对象的方法 public Object create(Object target){ this.target = target; /* newProxyInstance的三个参数分别为: 被代理对象的类加载器 被代理对象实现的接口数组 InvocationHandler类的对象 */ Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this); return proxy; } /* 代理对象要执行的实际逻辑,方法的参数分别为: proxy 代理类对象 method 被代理对象的方法 args 被代理对象方法的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理在商店寻找需要的商品" ); System.out.println("跟客户确认商品"); method.invoke(target); System.out.println("完成本次代理"); return null; } }
(4)测试 动态代理
public class TestProxy { @Test public void testProxy(){ Person person = new Person(); CreateProxy createProxy = new CreateProxy(); Subject proxy = (Subject)createProxy.create(person); proxy.shopping();
/*
输出:
代理在商店寻找需要的商品
跟客户确认商品
付款,买到商品
完成本次代理
*/ } }
本文来自博客园,作者:藤原豆腐渣渣,转载请注明原文链接:https://www.cnblogs.com/javafufeng/p/16817443.html