Linfinity

Never say never.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

动态代理

Posted on 2020-08-10 15:32  Linfinity  阅读(63)  评论(0)    收藏  举报

一、背景知识

 

 

 

二、两种代理模式

 

 

 

 

 

三、动态代理的实现

 

 

 

************jdk动态代理实现(需要三个类)***************

 

 

 

 

 

 

 

四、动态代理实现步骤(代码演示)

1、创建目标接口

package cn.goo.service;

//目标接口
public interface BuyCar {
    void buy();
}

 

2、创建目标接口实现类

package cn.goo.shop;

import cn.goo.service.BuyCar;


//目标类:方法需要功能增强的类
public class AudiShop implements BuyCar {
    @Override
    public void buy() {
        System.out.println("购买了一辆奥迪汽车,花费了30w元!");

    }
}

 

3、创建InvocationHandler接口实现类

package cn.goo.handler;

import cn.goo.service.BuyCar;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class CarInvocationHandler implements InvocationHandler {
    //具体需要功能增强的目标类对象
    private BuyCar target;

    public CarInvocationHandler(BuyCar shop) {
        this.target = shop;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        /*----------执行目标类原方法------------------*/
        Object res = method.invoke(this.target, args);

        /*----------功能增强------------------*/
        System.out.println("限时优惠,买车送车模.......");

        return res;
    }
}

 

4、使用动态代理调用

 @Test
    public void test01(){
        //1.创建目标类对象
        BuyCar shop = new AudiShop();
        //2.创建handler对象
        CarInvocationHandler carInvocationHandler = new CarInvocationHandler(shop);
        //3.创建代理对象
        BuyCar proxy = (BuyCar) Proxy.newProxyInstance(
                shop.getClass().getClassLoader(),
                shop.getClass().getInterfaces(),
                carInvocationHandler);

        //4.方法调用
        proxy.buy();

 

5、输出结果