`
djun100
  • 浏览: 165664 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Java设计模式Proxy之动态代理

 
阅读更多

Java动态代理主要涉及到两个类:

  • InvocationHandler:该接口中仅定义了一个Object : invoke(Object proxy, Method method, Object[] args);参数proxy指代理类,method表示被代理的方法,args为method中的参数数组,返回值Object为代理实例的方法调用返回的值。这个抽象方法在代理类中动态实现。
  • Proxy:所有动态代理类的父类,提供用于创建动态代理类和实例的静态方法。

所谓动态代理类是在运行时生成的class,在生成它时,你必须提供一组interface给它,则动态代理类就宣称它实现了这些interface。当然,动态代理类就充当一个代理,你不要企图它会帮你干实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。


下面通过实例来说明:


Subject.java

  1. /**
  2. *抽象角色:声明真实对象和代理对象的共同接口
  3. *@authorWalkingDog
  4. *
  5. */
  6. publicinterfaceSubject{
  7. publicvoiddoSomething();
  8. }

RealSubject.java

  1. *真实对象:定义目标操作
  2. *@authorWalkingDog
  3. *
  4. */
  5. publicclassRealSubjectimplementsSubject{
  6. @Override
  7. publicvoiddoSomething(){
  8. System.out.println("RealSubject.doSomething");
  9. }
  10. }

DynamicProxy.java

  1. importjava.lang.reflect.InvocationHandler;
  2. importjava.lang.reflect.Method;
  3. publicclassDynamicProxyimplementsInvocationHandler{
  4. privateObjectobject;
  5. publicDynamicProxy(Objectobject){
  6. this.object=object;
  7. }
  8. @Override
  9. publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
  10. throwsThrowable{
  11. System.out.println("BeforeInvoke!method:"+method);
  12. //我们可以再代理方法调用前后添加功能
  13. Objectresult=method.invoke(object,args);
  14. System.out.println("object:"+object+"\tresult:"+result+"\targs:"+args);
  15. System.out.println("AfterInvoke!");
  16. returnresult;
  17. }
  18. }

Client.java

  1. importjava.lang.reflect.InvocationHandler;
  2. importjava.lang.reflect.Proxy;
  3. /**
  4. *客户端
  5. *@authorWalkingDog
  6. *
  7. */
  8. publicclassClient{
  9. publicstaticvoidmain(String[]args)throwsException{
  10. //创建目标对象,也就是被代理对象
  11. RealSubjectrealSubject=newRealSubject();
  12. //将目标对象交给代理
  13. InvocationHandlerhandler=newDynamicProxy(realSubject);
  14. //Class<?>proxyClass=Proxy.getProxyClass(Subject.class.getClassLoader()
  15. //,newClass[]{Subject.class});
  16. //Subjectsubject=(Subject)proxyClass.getConstructor(newClass[]{InvocationHandler.class})
  17. //.newInstance(newObject[]{handler});
  18. //返回代理对象,相当于上面两句
  19. Subjectsubject=(Subject)Proxy.newProxyInstance(handler.getClass().getClassLoader(),
  20. realSubject.getClass().getInterfaces(),
  21. handler);
  22. //叫代理对象去doSomething(),其实在代理对象中的doSomething()中还是会
  23. //用handler来调用invoke(proxy,method,args)参数proxy为调用者subject(this),
  24. //method为doSomething(),参数为方法要传入的参数,这里没有
  25. subject.doSomething();
  26. }
  27. }

打印结果:
Before Invoke ! method : public abstract void Subject.doSomething()
RealSubject.doSomething
object : RealSubject@ec6b00 result : null args : null
After Invoke !


分享到:
评论

相关推荐

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    java 代理模式实现代码及设计详解:动态代理模式、静态代理模式

    JAVA设计模式chm文档

    设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码)

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...

    java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar

    java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...

    JAVA设计模式之结构模式

    这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...

    详解设计模式中的proxy代理模式及在Java程序中的实现

    详解设计模式中的proxy代理模式及在Java程序中的实现共14页.pdf.zip

    33种JAVA设计模式DEMO

    代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式...

    JAVA设计模式(代理模式)

    代理模式又叫Proxy模式(英文)。所谓的代理,就是一个人或者一个机构代替另一个人或者另一个机构去做一些事情。(类似于中介或者代理商)。

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    java实现Proxy例子

    我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler...在研究代理模式(Proxy模式)的朋友可以交流一下

    apache开源项目源码commons-proxy-1.0-src(全部高质量代理模式proxy的java源程序)

    全部高质量代理模式proxy的java源程序 java.proxy,代理模式源码,设计模式,apache开源项目源码commons-proxy-1.0-src 各种代理模式操作的工具类源码以及代理模式案例源码,你会从中得到意想不到的效果! apache...

    Java 动态代理.md

    代理模式(Proxy Pattern)是 23 种设计模式的一种,属于结构型模式。他指的是一个对象本身不做实际的操作,而是通过其他对象来得到自己想要的结果。这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作,...

    java设计模式教程+源代码

    Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ) Iterator ( 迭代器模式 ) Mediator ( 中介者模式 ) Memento ( 备忘录模式 ) Observer ( 观察...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    java静态代理和动态代理详解

    Java中的代理是一种常见的设计模式,它可以帮助我们在不改变原有代码逻辑的情况下,对现有对象进行增强或扩展。在代理模式中,主要有两种类型:静态代理和动态代理。 1.静态代理: 静态代理是指在编译期间就已经确定...

    java 常用设计模式chm

    设计模式中定义: 为其他对象提供一种代理以控制对这个对象的访问. 为什么要使用Proxy? 1.授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问论坛有两种人:...

    23种设计模式的实现(Java 版),java设计模式

    Factory模式,Prototype模式,Builder 模式,Singleton模式,Facade模式,Proxy模式,Adapter模式,Composite模式,Decorator模式....

    java代理模式

    java设计模式,代理模式

    设计模式专题,代理模式,工厂模式

    设计模式专题,代理模式,工厂模式

    JAVA设计模式-day2.pdf

    JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...

Global site tag (gtag.js) - Google Analytics