浅析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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程