Java反射机制剖析(三)-简单谈谈动态代理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java反射机制剖析(三)-简单谈谈动态代理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4755字,纯文字阅读大概需要7分钟。
内容图文
通过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 { publicvoid 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()"); thrownew RuntimeException(); } } publicvoid delUser(String userId) { System.out.println("UserManagerImpl.delUser() userId-->>" + userId); } public String findUser(String userId) { System.out.println("UserManagerImpl.findUser() userId-->>" + userId); return "张三"; } publicvoid 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; } publicvoid 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()"); } } publicvoid delUser(String userId) { } public String findUser(String userId) { returnnull; } publicvoid 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<args.length; i++) { System.out.println(args[i]); } Object ret = null; try { //调用目标方法 ret = method.invoke(targetObject, args); System.out.println("success-->>" + 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() --- 张三
原文:http://www.cnblogs.com/crazylqy/p/4253304.html
内容总结
以上是互联网集市为您收集整理的Java反射机制剖析(三)-简单谈谈动态代理全部内容,希望文章能够帮你解决Java反射机制剖析(三)-简单谈谈动态代理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。