首先:
Class Proxy:
1 2 3 | Module java.base Package java.lang.reflect Class Proxy |
public class Proxy
extends Object
implements Serializable
如何实现动态代理?
查看Proxy中的方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
查看参数:
1 2 3 4 5 | loader——定义代理类的类加载器 interfaces——代理类要实现的接口列表 h -将方法调用分派给的调用处理程序 |
总结:使用代理类需要:
被代理类的类加载器 ClassLoader 对象;
被代理类实现的接口的class;(创建的代理类也会实现这个接口)
还要一个执行操作的类 -- 实现了 InvocationHandler 接口的子类。
这样返回的就是第二个传入的接口类型的对象,使用这个对象就能执行被代理类中的方法。
如何执行方法?
InvocationHandler 接口:
1 2 3 | Module java.base Package java.lang.reflect Interface InvocationHandler |
public interface InvocationHandler
该接口只有一个方法:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
参数:
1 2 3 4 5 | proxy 调用方法的代理实例 method 对应于代理实例上调用的接口方法的Method实例。 args 包含在代理实例上的方法调用中传递的参数值的对象数组,如果接口方法不接受任何参数,则返回 null 。 |
实现并重写这个方法,一般需要创建一个接收被代理类的属性:
然后使用这个属性调用传入的方法method参数:
Object result = method.invoke(target,args)
然后返回result就是执行方法的结果;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)