代理模式(静态代理+动态代理)——JAVA
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了代理模式(静态代理+动态代理)——JAVA,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4892字,纯文字阅读大概需要7分钟。
内容图文
代理模式是常用的java设计模式,他的特征是代理类与目标类有同样的接口,代理类主要负责为目标类预处理消息、过滤消息、把消息转发给目标类,以及事后处理消息等。代理类与目标类之间通常会存在关联关系,一个代理类的对象与一个目标类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用目标类的对象的相关方法,来提供特定的服务。
结构图如下:
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类(Proxy)的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建代理类(Proxy)而成。
静态代理:
package ZhuDan.Test; public interface UserManager { public void addUser(String UserId,String UserName); public void queryUser(String UserId); }UserManagerImpl目标类实现UserManager接口:
package ZhuDan.Test; public class UserManagerImpl implements UserManager { public void addUser(String UserId,String UserName) { System.out.println("用户ID:"+UserId); System.out.println("用户名:"+UserName); } public void queryUser(String UserId){ System.out.println("用户ID:"+UserId); } }UserManagerImplProxy代理类实现UserManager接口:
package ZhuDan.Test; 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("~~~~~~~~~~addUser开始执行~~~~~~~~~~~"); userManager.addUser( UserId,UserName); }catch(Exception e){ e.printStackTrace(); System.out.print("~~~~~~~~~~addUser执行出错~~~~~~~~~~~"); }finally{ System.out.print("~~~~~~~~~~addUser成功执行~~~~~~~~~~~"); } } public void queryUser(String UserId){ try{ System.out.println("~~~~~~~~~~queryUser开始执行~~~~~~~~~~~"); userManager.queryUser( UserId); }catch(Exception e){ e.printStackTrace(); System.out.print("~~~~~~~~~~queryUser执行出错~~~~~~~~~~~"); }finally{ System.out.print("~~~~~~~~~~queryUser成功执行~~~~~~~~~~~"); } } }
package ZhuDan.Test; public class Manager { public static void main(String args[]){ UserManager userManager=new UserManagerImplProxy(new UserManagerImpl()); userManager.addUser("0001", "张三"); userManager.queryUser("0001"); } }
动态代理:
package ZhuDan.Test; public interface UserManager { public void FindUserById(String UserId); public void addUser(String UserId,String UserName); }UserManagerImpl目标类实现UserManager接口:
package ZhuDan.Test; public class UserManagerImpl implements UserManager { public void addUser(String UserId,String UserName) { System.out.println("用户ID:"+UserId); System.out.println("用户名:"+UserName); } public void FindUserById(String UserId){ System.out.println("用户ID:"+UserId); } }UserManagerImplProxy代理类实现InvocationHandler接口:
package ZhuDan.Test1; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class UserManageProxy implements InvocationHandler { private Object target; /** * 绑定委托对象并返回一个代理类 * @param target * @return */ public Object bind(Object target) { //目标 this.target = target; ClassLoader str= target.getClass().getClassLoader(); //取得代理对象 //newProxyInstance三个参数:代理类的装载器、接口、指派方法调用的调用处理程序 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } //args:包装所有参数 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; System.out.println("~~~~~~~~~~"+method.getName()+" 开始执行~~~~~~~~~~~"); //取得参数 for(int i=0;i<args.length;i++){ System.out.println("《~~~~~~~~~~参数为:"+args[i]+"~~~~~~~~~~~》"); } try{ //执行方法 ,添加方法就是target,args是参数 result=method.invoke(target, args); System.out.println("~~~~~~~~~~"+method.getName()+" 成功执行~~~~~~~~~~~"); }catch(Exception e){ e.printStackTrace(); System.out.print("~~~~~~~~~~"+method.getName()+"执行出错~~~~~~~~~~~"); } return result; } }Manager类:
package ZhuDan.Test1; public class Manager { public static void main(String args[]){ UserManageProxy userManagerProxy=new UserManageProxy(); UserManager userManager=(UserManager)userManagerProxy.bind(new UserManagerImpl()); userManager.FindUserById("0001"); userManager.addUser("0001", "张三"); } }输出结果:
分析:
public interface InvocationHandler {
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
}
参数说明:
Object proxy:指被代理的对象。
Method method:要调用的方法
Object[] args:方法调用时所含的参数
Proxy类:
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,提供了如下的操作方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
参数说明:
ClassLoader loader:类加载器,代理类和目标类为同一个加载器。
Class<?>[] interfaces:得到目标类的所有接口
InvocationHandler h:得到InvocationHandler接口的子类实例,即代理类(UserManagerImplProxy)
总结:
动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类,而java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
原文:http://blog.csdn.net/dandanzmc/article/details/38387213
内容总结
以上是互联网集市为您收集整理的代理模式(静态代理+动态代理)——JAVA全部内容,希望文章能够帮你解决代理模式(静态代理+动态代理)——JAVA所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。