JDK动态代理

代理:代理基于反射机制。也就是说学代理前需要对反射机制有一定的了解。

代理模式的作用:

  1. 增强功能:在原有的功能上,增加了额外的功能,这一步骤称为增强功能
  2. 控制访问:因为代理类似于中间商,作为一个中间轴,他可让你与你需要访问的对象进行间接的访问。

什么是动态代理:在程序执行过程中,使用jdk反射机制,创建出代理类对象并动态指向代理目标类。

JDK动态代理的特点:

  1. 目标对象必须实现业务接口
  2. jdk动态代理对象不需要去实现业务接口
  3. jdk动态代理对象在程序运行前不存在,在程序运行时动态在内存中构建
  4. jdk动态代理能灵活的进行业务功能的切换
  5. 自定义类中的方法(非接口方法不能被代理)

也就是说:jdk动态代理必须要有接口,目标类必须实现接口,若没有接口,则需要采用cglib动态代理的方式。

jdk动态代理的实现步骤

1,编写目标接口

//假设接口中存在销售 sell方法
public interface UsbService {
    float sell(int count);
}

 2,自定义类去实现目标接口

//自定义类实现目标接口中方法的内容,方法体中写入执行功能
public class UsbServiceImpl implements UsbService {
    @Override
    public float sell(int count) {
        System.out.println("调用开始");
        return 85.0f*count;
    }
}

3,自定义类去实现一个invocationhandler接口,后去重写里头的invoke方法

public class UsebHandler implements InvocationHandler {
//因为在要懂得调用的是哪个对象的方法,所以需要去声明变量去存储
    private Object duixiang;
    public UsebHandler(Object duixiang){
        this.duixiang=duixiang;
    }
    /**
     * @param proxy 代理对象
     * @param method 对象中的方法
     * @param args 对象方法中的参数
     * @return Object
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //进行方法的调用
        Object invoke = method.invoke(duixiang, args);
        if(invoke!=null){
            float price=(float) invoke;
            //代理内容 price为目标对象价格上加上20
            price+=20;
            System.out.println("商家送你一朵小红花");
            return price;
        }
        return invoke;
    }
}

4,自定义去调用proxy对象中的newproxyinstance方法,拿其返回值转换为接口类型后调用该接口中的方法即可

public class CustomerController {
    public static void main(String[] args) {
        UsbService use=new UsbServiceImpl();
        UsebHandler usebHandler = new UsebHandler(use);
        /**
         * 参数一:传入目标对象的类加载器
         * 参数二:传入目标对象的实现接口
         * 参数三:传入带有实现方法体的invocationhandler对象
         *需要将proxy.newproxyintance返回值转换为接口,因为实际调
         *用的方法在该接口中
         */
        UsbService usbService=(UsbService) Proxy.newProxyInstance(use.getClass().getClassLoader(), 
use.getClass().getInterfaces(),
                usebHandler);
//其中该处的usbService.sell(2)分别对应handler接口中的的invoke参数
        float sell = usbService.sell(2);
        System.out.println("usb价格是---->>>"+sell);
        System.out.println("调用结束");
    }
}

以上内容均个人小白理解,如有误请多包涵

谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值