Java反射机制中动态代理的示例分析
发表于:2024-09-23 作者:千家信息网编辑
千家信息网最后更新 2024年09月23日,这篇文章主要介绍了Java反射机制中动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 代理模式代理模式就是为其他对
千家信息网最后更新 2024年09月23日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安全错误
数据库的锁怎样保障安全
imap服务器配置错误
文件传输服务器断点续传
网络安全保护基本法是
荣耀全明星最新服务器
女软件开发转软件测试
互联网科技那些事可以做
术士魔兽数据库
长沙crm软件开发报价
rust怎么成为服务器管理
李沧区网络安全法
广东省网络安全宣传周
软件开发意图及应用目标
科技互联网有哪些股
网咖的服务器多贵
Web服务器放哪里最不安全
软件开发工程师(无线)
刑警管网络安全吗
软件开发和测试工程师
做软件开发要学哪些
人民检察院加强网络安全管理
学习网络安全的文章
政务中心网络安全自查报告
服务器测试内容
网络安全技术新发展
机算机网络技术是干什么的
服务器为什么可以装上系统
安徽中宾网络技术官网
单片机上位机软件开发教程
青岛移动IP地址和DNS服务器
linux查看服务器端口是否通