Java反射机制中动态代理的示例分析
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍了Java反射机制中动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 代理模式代理模式就是为其他对
千家信息网最后更新 2025年01月20日Java反射机制中动态代理的示例分析
这篇文章主要介绍了Java反射机制中动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
1. 代理模式
代理模式就是为其他对象提供一种代理来控制对这个对象的访问。其实代理模式是在访问的对象时引入一定程度的间接性,这种间接性可以附加多种用途。
它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
2. 分类
代理类按照创建时期可以分为两种,静态代理类和动态代理类。
静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理类:在程序运行时,运用反射机制动态创建而成。
3. 静态代理和动态代理举例
静态代理:
业务接口类:
package com.bjpowernode.pattern; public interface UserManager { public void addUser(String userId, String userName); public void delUser(String userId); public void modifyUser(String userId, String userName); public String findUser(String userId); }
业务接口实现类:
package com.bjpowernode.pattern; public class UserManagerImpl implements UserManager { public void addUser(String userId, String userName) { //System.out.println("start-->>addUser() userId-->>" + userId); try { System.out.println("UserManagerImpl.addUser() userId-->>" + userId); //System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); //System.out.println("error-->>addUser()"); throw new RuntimeException(); } } public void delUser(String userId) { System.out.println("UserManagerImpl.delUser() userId-->>" + userId); } public String findUser(String userId) { System.out.println("UserManagerImpl.findUser() userId-->>" + userId); return "张三"; } public void modifyUser(String userId, String userName) { System.out.println("UserManagerImpl.modifyUser() userId-->>" + userId); } }
业务代理类:
package com.bjpowernode.pattern; public class UserManagerImplProxy implements UserManager { private UserManager userManager; public UserManagerImplProxy(UserManager userManager) { this.userManager = userManager; } public void addUser(String userId, String userName) { try { System.out.println("start-->>addUser() userId-->>" + userId); userManager.addUser(userId, userName); System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>addUser()"); } } public void delUser(String userId) { } public String findUser(String userId) { return null; } public void modifyUser(String userId, String userName) { } }
客户端类:
package com.bjpowernode.pattern; public class Client { /** * @param args */ public static void main(String[] args) { //UserManager userManager = new UserManagerImpl(); UserManager userManager = new UserManagerImplProxy(new UserManagerImpl()); userManager.addUser("0001", "张三"); } }
运行结果:
start-->>addUser() userId-->>0001 UserManagerImpl.addUser() userId-->>0001 success-->>addUser()
动态代理:
业务接口类:
package com.bjpowernode.pattern; public interface UserManager { public String test(String userId); }
业务接口实现类:
package com.bjpowernode.pattern; public class UserManagerImpl implements UserManager { public String test(String userId) { System.out.println("UserManagerImpl.findUser() userId-->>" + userId); return "张三"; } }
BusinessHandler类:
package com.bjpowernode.pattern; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class BusinessHandler implements InvocationHandler { private Object targetObject; public Object newProxyInstance(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("start-->>" + method.getName()); for (int i=0; i>" + method.getName()); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>" + method.getName()); throw e; } return ret; } }
客户端类:
package com.bjpowernode.pattern; import java.lang.reflect.Field; public class Client { /** * @param args */ public static void main(String[] args) { BusinessHandler businessHandler = new BusinessHandler(); UserManager userManager = (UserManager)businessHandler.newProxyInstance(new UserManagerImpl()); //userManager.addUser("0001", "张三"); //userManager.delUser("0001"); // System.out.println(userManager.getClass().getName()); String name = userManager.test("0001"); //String name = ((UserManagerImpl) logHandler.newProxyInstance(new UserManagerImpl())).test("0001"); System.out.println("Client.main() --- " + name); } }
运行结果:
start-->>test 0001 UserManagerImpl.findUser() userId-->>0001 success-->>test Client.main() --- 张三
感谢你能够认真阅读完这篇文章,希望小编分享的"Java反射机制中动态代理的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
代理
动态
对象
委托
业务
接口
张三
消息
篇文章
静态
运行
机制
反射
模式
程序
示例
分析
客户
客户端
结果
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
链接数据库代码
网络安全最基本的要求
单位与网站网络安全协议书
软件开发年终教学总结
腾讯云应用服务器是什么
软件开发需要报什么专业
设计公司组织结构数据库
软件开发找工作用什么软件
失落的方舟东部北美服务器
db2数据库版本升级
网络管理服务器惠普
思科dhcp服务器配置
网络安全各个领域
影子数据库爆破
神通数据库sql改字段长度
avast网络安全版下载
db2有数据库吗
广电网络安全预案
金山区智能网络技术设备
网络安全军工龙头
delphi数据库安全问题
允许用户连接到数据库的系统权限
电商网络安全例子
嵌入式软件开发基础题
多人编辑数据库网站
尘香软件开发
云服务器的优缺点
杭州蛮牛网络技术
ei智能网络技术大学
移动办公怎么查看服务器地址