动态代理

 

动态代理就是通过代理类(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();
     /*
输出:
代理在商店寻找需要的商品
跟客户确认商品
付款,买到商品
完成本次代理

*/
} }

 

posted @ 2022-10-22 22:03  藤原豆腐渣渣  阅读(35)  评论(0编辑  收藏  举报