浅析Jdk动态代理

摘要

本文通过一个实例浅析jdk动态代理,即使用jdk动态代理来完成aop,实现对目标方法的增强操作。
话不多说,进入正题

创建要代理的目标

注意:在我们使用jdk动态代理时有一个前提就是被代理的对象必须是一个接口

//模拟一个卖usb的场景
public interface SellUSB {

    float sell(int count);

}
//金士顿厂家直销每一个卖85块
public class JinShiDun implements SellUSB {
    @Override
    public float sell(int count) {
        float price= (float) 85.0;
        return count*price;
    }
}

创建代理类

创建代理类时我们只需要实现 InvocationHandler 接口,重写invoke方法即可

public class MyHandler implements InvocationHandler {

    //被代理的对象
    private Object xx;
    
    //构造方法用于传递被代理对象参数
    MyHandler(Object xx){
        this.xx=xx;
    }

    //重要步骤,jdk动态代理就是使用Proxy类中的静态方法newProxyInstance创建出来真正的代理类
    /*
    public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
    参数一:被代理类的类加载器
    参数二:被代理类的接口
    参数三:自己写的代理类处理器
    */
    Object getProxyInstance(){
        return Proxy.newProxyInstance(xx.getClass().getClassLoader(),xx.getClass().getInterfaces(),this);
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //在invoke方法中可以对目标方法进行增强操作
        Object res=null;
        Object arg = args[0];

        //执行被代理的方法
        res=method.invoke(xx, args);

        //后置增强操作(理解为代理商代理金士顿厂家卖usb,每一个会贵25块)
        if (res!=null){
            Float price= (Float) res;
            price = price + ((int)arg*25);
            res=price;
        }
        return res;
    }
}

测试结果

public class TestProxy {
    public static void main(String[] args) {
        //初始化代理目标,在这里使用多态的方式,不仅仅只能代理金士顿,完全可以换个类比如华硕
        SellUSB sellUSB=new JinShiDun();
        //将要被代理的对象传递进自己的代理处理器
        MyHandler myHandler=new MyHandler(sellUSB);
        //得到jdk为我们生成创建的代理类
        SellUSB proxyInstance = (SellUSB) myHandler.getProxyInstance();
        //在代理类中有所有的被代理的方法,调用代理类中的方法走增强后的逻辑
        System.out.println(proxyInstance.sell(2));
    }
}

总结

1.jdk动态代理用于实现功能增强
2.使用jdk动态代理必须要有接口
3.jdk动态代理主要是实现InvocationHandler来完成增强逻辑的编写
4.jdk动态代理是通过Proxy类中的静态方法newProxyInstance来完成真正代理类的创建
5.源码的解析我才疏学浅,想了解源码的可以移步https://www.cnblogs.com/MOBIN/p/5597215.html

posted @   Cv工程师120621号  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示

目录导航