Java动态代理示例分析
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要讲解了"Java动态代理示例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java动态代理示例分析"吧!定义动态代理指的是,代理类和目
千家信息网最后更新 2025年01月31日Java动态代理示例分析
这篇文章主要讲解了"Java动态代理示例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java动态代理示例分析"吧!
定义
动态代理指的是,代理类和目标类的关系在程序运行的时候确定的,客户通过代理类来调用目标对象的方法,是在程序运行时根据需要动态的创建目标类的代理对象。
分类
jdk动态代理
cglib动态代理
案例
需求
苹果公司通过苹果代理商来卖手机
方案一:jdk动态代理
定义抽象接口
/** * 售卖手机的接口(代理模式--抽象角色) * @author:liyajie * @createTime:2022/2/22 14:42 * @version:1.0 */public interface IPhone { /** * 出售手机 * @author: liyajie * @date: 2022/2/22 14:44 * @param * @return void * @exception: * @update: * @updatePerson: **/ void sellPhone();}
定义目标类实现接口,重写接口方法
/** * 苹果公司(代理模式--目标角色) * @author:liyajie * @createTime:2022/2/22 14:46 * @version:1.0 */public class TargetPhone implements IPhone { @Override public void sellPhone() { System.out.println("苹果公司正在出售手机"); }}
定义代理类
/** * 代理商(代理模式--代理角色) * @author:liyajie * @createTime:2022/2/22 14:50 * @version:1.0 */public class ProxyPhone { private Object target; public ProxyPhone(Object target){ this.target = target; } public Object getProxyInstance() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("JDK动态代理开始之前,添加业务逻辑XXX"); //使用反射机制来调用目标对象的方法:解决了问题二 Object invoke = method.invoke(target, args); System.out.println("JDK动态代理结束之后,添加业务逻辑XXX"); return invoke; } }); }}
定义测试类
/** * 测试类 * @author:liyajie * @createTime:2022/2/23 15:15 * @version:1.0 */public class Test { public static void main(String[] args) { // 创建目标类 TargetPhone targetPhone = new TargetPhone(); // 创建代理类 IPhone iPhone = (IPhone) new ProxyPhone(targetPhone).getProxyInstance(); System.out.println(iPhone.getClass()); // 通过代理类调用目标方法 iPhone.sellPhone(); }}
查看测试结果
方案二:cglib动态代理
定义目标类
/** * 苹果公司(代理模式--目标角色) * @author:liyajie * @createTime:2022/2/22 14:46 * @version:1.0 */public class TargetPhone { public void sellPhone() { System.out.println("苹果公司正在出售手机"); }}
定义代理工厂,用来获取代理类
/** * 代理工厂 * @author:liyajie * @createTime:2022/2/23 15:32 * @version:1.0 */public class ProxyFactory implements MethodInterceptor { private Object target; public ProxyFactory(Object target){ this.target = target; } public Object getProxyInstance(){ // 创建一个工具类 Enhancer enhancer = new Enhancer(); // 设置父类 enhancer.setSuperclass(target.getClass()); // 设置回调函数 enhancer.setCallback(this); // 创建子类对象,即代理对象 return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("cglib动态代理开始之前,添加业务逻辑xxxx"); Object invoke = method.invoke(target, objects); System.out.println("cglib动态代理之后,添加业务逻辑"); return invoke; }}
定义测试类
/** * 测试类 * @author:liyajie * @createTime:2022/2/23 15:44 * @version:1.0 */public class Test { public static void main(String[] args) { // 创建目标对象 TargetPhone targetPhone = new TargetPhone(); // 获取代理对象 TargetPhone proxyInstance = (TargetPhone)new ProxyFactory(targetPhone).getProxyInstance(); // 通过代理对象调用具体的方法 proxyInstance.sellPhone(); }}
查看测试结果
分析
首先可以看到不管是jdk动态代理,还是cglib动态代理,实现的效果和静态代理是一模一样的,都实现了功能的扩展。但是两种动态代理还是有些不同的,其中jdk动态代理需要目标对象实现接口,但是cglib动态代理不需要,因为他是在内存中构建一个子类对象,从而实现对目标对象的功能扩展。
总结
通过案例,我们了解了代理模式的几种实现方式,下面我们总结下该模式:
优势:
代理模式在客户端和目标对象之间起到了一个中介和保护的作用
代理对象可以对目标对象进行功能的扩展和业务的扩展,增强目标对象
代理模式可以将客户端和目标对象分离,在一定程度上降低了系统的耦合度
劣势:
请求需要经过代理对象,会导致处理速度变慢
因为会有大量的代理对象产生,会增加系统的复杂度
感谢各位的阅读,以上就是"Java动态代理示例分析"的内容了,经过本文的学习后,相信大家对Java动态代理示例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
代理
动态
对象
目标
模式
苹果
测试
分析
业务
公司
手机
接口
方法
示例
角色
逻辑
苹果公司
功能
客户
学习
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
怎么在服务器上添加一个上网账户
深圳市云联科创互联网科技有限公司
软件开发毕业论文包含
支持cgi的服务器
京东快递计算机网络技术应用
网络安全法对照的条例
根据网络安全法网络运营者之
查询数据库中的信息
猎人竞技场ps5服务器说明
2021网络安全绘画宣传
网络安全的小学生画
三级网络安全评估
网络安全可行研究报告
三国杀服务器登录错误是什么原因
修改数据库权限
系统管理软件开发
上海服务器散热器订制
泰坦云软件开发平台
2021上海辅警报名数据库出错
服务器远程管理软件有哪些
数据库照片设置为图像文件
七大网络安全实验室有哪些
趣游网络技术有限公司
合肥向宇互联网科技有限公司
公安数据安全员网络安全培训
安卓软件开发是程序员吗
数据库索引类型外键
怀旧服游戏内查看数据库
网络安全知识内容运营是什么
无线网络安全博客