
JDK的动态代理
创建目标对象并注入委托类。 使用ReflectionAPI通过类加载器创建动态代理对象。 调用代理对象的方法时,委托类的
发布日期:2021-05-18 05:30:27
浏览次数:16
分类:精选文章
本文共 1996 字,大约阅读时间需要 6 分钟。
JDBC代理模式是实现远程调用或对业务逻辑抽象化的常用解决方案。 通过创建代理对象,可以将业务逻辑的实现与调用逻辑分开,提升系统的可扩展性和灵活性。 在本次实践中,我们通过Java反射机制实现了代理模式。
业务接口service
中定义了两个方法:
doSome(int a, String b)
:根据输入参数计算结果。doOther()
:执行无返回的业务操作。
目标实现类serviceImple
实现了上述接口,即负责具体执行业务逻辑。
委托类ProxyEntrust
采用了传统的InvocationHandler实现方式。 代理对象的命名规则为$+proxy+数字
,这有助于区分不同的代理实例。
代理创建流程如下:
invoke
方法会被触发。代理对象的方法执行流程为:
invoke
获取目标方法。method.invoke(target, args)
执行目标方法。- 返回结果。
通过实践发现,代理对象的名称不仅包含确定性部分,还包含随机数字,以保证唯一性。 代理实现中,目标对象通过构造器注入,这种方式确保了灵活性。
代码示例如下:
public interface service { String doSome(int a, String b); void doOther();}public class serviceImple implements service { @Override public String doSome(int a, String b) { System.out.println("执行业务方法doSome()"); return a + b; } @Override public void doOther() { System.out.println("执行业务方法doOther()"); }}import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import Service.service;import Service.serviceImple;public class ProxyEntrust implements InvocationHandler { private service target; public ProxyEntrust(service target) { super(); this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(target, args); return result; }}public class Client { public static void main(String[] args) { service target = new serviceImple(); ProxyEntrust ih = new ProxyEntrust(target); service serviceProxy = (service) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), ih); String someResult = serviceProxy.doSome(5, "月份"); System.out.println("someResult = " + someResult); }}
以上代码展示了如何通过Java反射机制实现动态代理模式。 通过分析,可以看出代理类的核心逻辑在于方法调用的委托与转发。
这一设计方式在以下场景下表现尤为突出:
- 对业务逻辑高度抽象化的需求。
- 对目标对象的实例化控制需求。
- 需要实现远程调用或跨层业务流程的需求。
通过合理设计InvocationHandler,可以更灵活地扩展系统功能。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年05月10日 15时03分28秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
用户登陆的验证码的制作
2019-03-16
升级java11后,maven命令打包报错
2019-03-16
springboot redis key乱码
2019-03-16
Win10禁用自带的笔记本键盘
2019-03-16
insmod模块的几种常见错误
2019-03-16
写时复制集合 —— CopyOnWriteArrayList
2019-03-16
什么是redis的缓存雪崩, 穿透, 击穿?
2019-03-16
【转载】DSP基础--定点小数运算
2019-03-16
idea thymeleaf页面变量报错解决
2019-03-16
云游戏,打响5G第一战
2019-03-16
Docker 拉取镜像速度太慢
2019-03-16
HUAWEI防火墙通过IKE方式协商IPSec隧道(采用预共享密钥认证)
2019-03-16
计网复习3
2019-03-16
JDK动态代理的实现原理
2019-03-16
Spring Security 架构与源码分析
2019-03-16
教程丨使用MeterSphere做Dubbo接口测试
2019-03-16
【毕设-STM32f103寄存器版本】智能防盗系统
2019-03-16
勒索病毒Kraken2.0.7分析
2019-03-16
MySQL错误1366处理方法
2019-03-16