JDK动态代理实例
最近看《深入浅出MyBatis技术原理与实战》这本书时,里面讲到Mapper接口的内部实现是通过JDK动态代理生成实现类,联想到之前看《SPRING技术内幕》这本书里也常常提到JDK动态代理,之前自己也转载过动态代理的文章,但一直印象不深,这次就亲自动手写个动态代理的实例。
1.目标类接口
这个可以说是JDK动态代理的一个缺陷,就是目标类必须要实现一个接口类,才能实现动态代理,对于没有接口实现的目标类,可以通过cglib来实现动态代理。
1 2 3 4 | public interface HelloService { void sayHello(); } |
2.目标类的实现
1 2 3 4 5 6 | public class HelloServiceImpl implements HelloService { public void sayHello() { System.out.println( "hello world" ); } } |
实现类中只有一个sayHello方法,方法内打印一句"hello world",简单。
3.生成代理类的实现(JDK动态代理技术)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class DynamicProxyFactory implements InvocationHandler { /** * 目标对象 */ public Object target; /** * 生成代理类 */ public Object createProxyInstance(Object target) { // 目标对象赋值 this .target = target; // 生成代理对象 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this ); } /** * 代理类中方法拦截 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 目标方法调用前 System.out.println( "++++ before invoke ++++" ); // 目标方法调用 Object result = method.invoke(target, args); // 目标方法调用后 System.out.println( "++++ after invoke ++++" ); return result; } } |
4.测试
1 2 3 4 5 6 7 8 9 | public class Test { public static void main(String[] args) { DynamicProxyFactory serviceProxy = new DynamicProxyFactory(); HelloService helloService = (HelloService) serviceProxy.createProxyInstance( new HelloServiceImpl()); helloService.sayHello(); } } |
以下是执行测试类的输出结果:
++++ before invoke ++++
hello world
++++ after invoke ++++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统