Java静态代理和动态代理
2014-03-18 10:48
369 查看
首先声明,本为并非原创,大量参考自http://layznet.iteye.com/blog/1182924,一方面做个备份,另一方面也是自己学习的过程。
一、代理
对一个类(委托类,实际完成工作的那个类)方法的调用交给另一个类(代理类,可以静态或动态生成)来完成。如果委托类和代理类实现了同一个接口,那么代理就可以很方便的完成。
二、静态代理
程序运行前代理类和委托类的关系就已经确定,代理类的字节码文件已经存在,代理不是运行时生成。
Code list 1, 接口定义:
代理类的源码在运行时有虚拟机反射生成,因此不存在字节码文件,代理类和委托类的关系在运行时确定。
Code list 6,动态代理对应的调用处理器:(说白了就是类似于代理的类)
一、代理
对一个类(委托类,实际完成工作的那个类)方法的调用交给另一个类(代理类,可以静态或动态生成)来完成。如果委托类和代理类实现了同一个接口,那么代理就可以很方便的完成。
二、静态代理
程序运行前代理类和委托类的关系就已经确定,代理类的字节码文件已经存在,代理不是运行时生成。
Code list 1, 接口定义:
package proxy.staticy; public interface Subject { void dealTask(String taskName); }Code list 2,委托类,真正做事情的类:
package proxy.staticy; public class RealSubject implements Subject { @Override public void dealTask(String taskName) { System.out.println("正在执行任务: " + taskName); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }Code list 3,代理类:
package proxy.staticy; public class ProxySubject implements Subject { private Subject delegate; public ProxySubject(Subject delegate) { this.delegate = delegate; } @Override public void dealTask(String taskName) { long start = System.currentTimeMillis(); delegate.dealTask(taskName); long end = System.currentTimeMillis(); System.out.println("任务耗时" + (end - start) + "毫秒"); } }Code list 4,生成代理的工厂类:
package proxy.staticy; public class SubjectStaticFactory { public static Subject getInstance() { return new ProxySubject(new RealSubject()); } }Code list 5,模拟客户端:
package proxy.staticy; public class Client1 { public static void main(String[] args) { Subject myProxy = SubjectStaticFactory.getInstance(); myProxy.dealTask("Task one"); } }三、动态代理
代理类的源码在运行时有虚拟机反射生成,因此不存在字节码文件,代理类和委托类的关系在运行时确定。
Code list 6,动态代理对应的调用处理器:(说白了就是类似于代理的类)
/** * 动态代理对应的调用处理器 */ package proxy.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class SubjectInvocationHandler implements InvocationHandler { // 代理类持有一个委托类的对象引用 private Object delegate; public SubjectInvocationHandler(Object delegate){ this.delegate = delegate; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { long start = System.currentTimeMillis(); // Method的invoke返回Object对象方法执行的结果 method.invoke(delegate, args); long end = System.currentTimeMillis(); System.out.println("任务执行耗时"+(end - start)+"毫秒"); return null; } }Code list 7,生成动态代理对象的工厂类:
/** * 生成动态代理对象的工厂. */ package proxy.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import proxy.staticy.RealSubject; import proxy.staticy.Subject; /** * 客户端调用此方法获得代理对象, * 对客户端来说,并不知道获取的是代理对象还是委托对象。 */ public class DynamicProxyFactory { public static Subject getInstance() { Subject delegate = new RealSubject(); InvocationHandler handler = new SubjectInvocationHandler(delegate); Subject proxy = (Subject) Proxy.newProxyInstance( delegate.getClass().getClassLoader(), new Class[] {Subject.class}, handler); return proxy; } }Code list 8,模拟客户端:
package proxy.dynamic; import proxy.staticy.Subject; public class Client2 { public static void main(String[] args) { Subject myProxy = DynamicProxyFactory.getInstance(); myProxy.dealTask("Task two"); } }
相关文章推荐
- [教程]Java代理(静态,动态jdk和Cglib)简单应用
- Java设计模式学习06——静态代理与动态代理
- Java 静态代理和动态代理
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- Java的静态代理和动态代理(网页排版不好,附上pdf附件)
- Java代理方式——静态代理和动态代理详解
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- Java代理之静态、动态代理
- java静态代理和动态代理(JDK和cglib)
- JAVA中的代理技术(静态代理和动态代理)
- Java中静态代理和动态代理介绍
- java静态代理与动态代理简单分析
- JAVA 设计模式:静态代理VS动态代理
- 从java 反射看延迟加载(代理模式)(六)——动态代理与静态代理
- JAVA中的静态代理、动态代理以及CGLIB动态代理
- Java代理(静态/动态 JDK,cglib)
- java中的静态代理与动态代理
- JAVA代理-静态代理和动态代理详解
- JAVA的静态代理与动态代理比较
- java代理(静态代理和jdk动态代理以及cglib代理)