黑马程序员——Java动态代理
来源:互联网 发布:淘宝联盟提现钱到哪里 编辑:程序博客网 时间:2024/04/27 13:21
黑马程序员——Java动态代理
---------------------- android培训、java培训、期待与您交流! ----------------------
代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问。
代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
在了解动态代理前先看一下简单的静态代理。
一、静态代理
用代码说话,静态代理示例:
public abstract class Subject { public abstract void request();}public class RealSubject extends Subject { public void request() { System.out.println("from realsubject"); }}public class ProxySubject extends Subject { private RealSubject realSubject; @Override public void request() { this.preRequest(); if (null == realSubject) { realSubject = new RealSubject(); } realSubject.request(); this.postRequest(); } private void preRequest() { System.out.println("preRequest"); } private void postRequest() { System.out.println("postRequest"); }}public class Client { public static void main(String[] args) { Subject subject=new ProxySubject(); subject.request(); }}
由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。
另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。
二、动态代理
动态代理步骤:
1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法
2.创建被代理的类以及接口
3.通过Proxy的静态方法
newProxyInstance(ClassLoader loader,Class[]interfaces, InvocationHandler h) 创建一个代理
4.通过代理调用方法
示例:
import java.lang.reflect.*;import java.util.*; public class DynamicProxy implements InvocationHandler { private Object proxy; // 被代理的对象 // 用于生产代理对象 public Object factory() { Class<?> clazz = proxy.getClass(); return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[]args) throws Throwable { System.out.println(method.getName() + " invoked."); System.out.println("params:"+Arrays.toString(args)); return method.invoke(this.proxy, args); } public Object getProxy() { return proxy; } public void setProxy(Object proxy) { this.proxy = proxy; } public DynamicProxy(Object proxy) { super(); this.proxy = proxy; } @SuppressWarnings("unchecked") public static void main(String[] args) { List<String> list = new ArrayList<String>(); DynamicProxy proxy = new DynamicProxy(list); list = (List<String>) proxy.factory(); list.add("fengyan"); System.out.println(list.getClass()); }}输出结果add invoked.params: [fengyan]class $Proxy0
详细请查看:http://edu.csdn.net/heima
- 黑马程序员——Java动态代理
- 黑马程序员—动态代理
- 黑马程序员—代理与动态代理
- 黑马程序员——Java动态类,代理
- 黑马程序员——学习笔记20.Java动态代理
- 黑马程序员——Java中的动态代理
- 黑马程序员——Java高新_动态代理
- 黑马程序员 java学习笔记——动态代理
- 黑马程序员——Java反射&动态代理
- 黑马程序员java学习<基础加强>—动态代理
- 黑马程序员—Java基础加强(动态代理)
- 黑马程序员—JAVA高新技术之类加载器、动态代理
- 黑马程序员—JAVA高新技术_动态代理
- 黑马程序员-java动态代理
- 黑马程序员---java动态代理
- 黑马程序员 java动态代理
- 黑马程序员-Java动态代理
- 黑马程序员--Java动态代理
- 对立,从批判开始
- 在Linux下编写Daemon
- Linux移植参考手册v1.0
- CentOS 编译 rebar出错
- xcode4.2新建Window_Base_Application的方法 英文版 按照书上做demo的有福了(很简单)
- 黑马程序员——Java动态代理
- 1031. Campus
- xcode生成文件
- Android媒体的一些使用总结
- 人工智能的一点摘抄 《视读 人工智能》
- OpenCV学习笔记(三十九)——再谈OpenCV的数据结构,Mat是如此强大
- 在Rprofile.site文件中设置R的镜像站点
- 最大子序列和的线性时间算法
- 先做个码农