当前位置:   article > 正文

Spring框架-GOF代理模式之JDK动态代理

Spring框架-GOF代理模式之JDK动态代理

我们可以分成三步来完成jdk动态代理的实现
第一步:创建目标对象
第二步:创建代理对象
第三步:调用代理对象的代理方法

public class Client {
    public static void main(String[] args) {
        //创建目标对象
        final OrderService target = new OrderServiceImpl();
        //创建代理对象
        OrderService proxyObj =(OrderService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new TImerInvocationHandler(target)); /*{
            //参数1:Object proxy, 代理对象的引用
            // 参数2:Method method, 目标对象上的目标方法
            // 参数3:Object[] args ,目标方法上的实参
        *//*    @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                //这个接口的目的就是为了让你有地方写增强代码
                //并且,当调用代理对象的代理方法的时候,此方法才会被jdk调用。
                System.out.println("增强1");
              //  method.invoke(target,args );
                target.generate();
                System.out.println("增强2");
                return null;
            }
        }*//*);*/
        //调用代理对象的代理方法
        proxyObj.generate();
        proxyObj.detail();
        proxyObj.modify();

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

创建代理对象时,我们传入的第三个参数就是实现InvocationHandler接口的实现类,重写invoke方法,就是让我们写增强功能的地方,代码如下:

public class TImerInvocationHandler implements InvocationHandler {
    private final OrderService target;

    public TImerInvocationHandler(OrderService target) {
        this.target = target;
    }

    //参数1:Object proxy, 代理对象的引用
    // 参数2:Method method, 目标对象上的目标方法
    // 参数3:Object[] args ,目标方法上的实参
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //这个接口的目的就是为了让你有地方写增强代码
            //并且,当调用代理对象的代理方法的时候,此方法才会被jdk调用。
            long begin = System.currentTimeMillis();
           Object retvalue = method.invoke(target, args);
            long end = System.currentTimeMillis();
            System.out.println("耗时"+(end-begin)+"毫秒");
            //返回值。这样才能保证目标方法中有返回值的方法在代理对象调用方法时可以拿到返回的值
            return retvalue;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在上述操作之前先创建相关类和接口,下方为简单示例:

//公共接口
public interface OrderService {
    void generate();
    void modify();
    void detail();
}
//实现类
public class OrderServiceImpl implements OrderService {

    @Override
    public void generate() {
        try {
            Thread.sleep(456);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("订单已生成");
    }

    @Override
    public void modify() {
        try {
            Thread.sleep(666);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("订单已修改");
    }

    @Override
    public void detail() {
        try {
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("订单详情");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/562329
推荐阅读
相关标签
  

闽ICP备14008679号