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();

    }

}

创建代理对象时,我们传入的第三个参数就是实现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;
    }
}

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

//公共接口
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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值