JDK实现动态代理
动态代理
基本介绍
- 代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理。
- 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象。
- 动态代理也叫作:JDK代理,接口代理。
JDK 中生成代理对象的API
- 代理类所在包:java.lang.reflect.Proxy
- JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:
/* newProxyInstance详解: 功能: 1. 接收传入的对象,获取目标对象。 2. 通过反射机制,获取相关的代理对象。 3. 通过代理对象,调用目标对象方法。 */ static Object newProxyInstance (ClassLoader loader, // 指定当前目标对象的类加载器,获取类加载器的方法固定 Class<?>[] interfaces, // 目标对象实现的接口类型,使用泛型方法确定数据类型 InvocationHandler h // 代理对象的核心,事件处理,执行目标对象的方法时,会触发事件处理器的方法,会将当前执行的目标对象方法作为参数传入。 );
★ 返回类型:函数返回的类型是 Object类型,但是我们要得到的代理对象应该声明为 目标对象的接口类型(代理类型)。
【易错重点】 如果要代理的目标对象是一般类,那么 newProxyInstance 的返回值类型 一般不强转为 目标对象的类型,必须强转为 包含代理目标对象方法的 接口的类型。
InvocationHandler 接口详解:(称为调用处理器)
InvocationHandler是一种函数式接口,内部定义了一个invoke方法,是代理对象的核心处理方法。
private Ojbect target = 目标对象; new InvocationHandler () { @Override public Object invoke(Object proxy, Method method, Object[] args) { // 自定义方法实现, 一般是method反射机制调用目标对象的方法,进行增强。 return null; } }
invoke
方法参数详解:
- proxy:代表的是目标对象的代理对象,invoke 方法可以返回 调用代理对象方法的返回结果,也可以返回对象的代理对象。通常 作为invoke方法的第一参数。
- method: 代表的是 代理对象调用的方法 -- (代理对象可以直接调用目标对象的接口中所有的方法)。
- args:代表的是 代理对象调用方法时,所传入的参数。
- 通常 自定义一个 private Ojbect target = 目标对象 ,在
invoke
方法中调用method 时,需要传入目标对象method.invoke(Object target, Ojbect[] args);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能