原文链接:http://www.orlion.ga/207/

一、代理模式

代理模式是经常用到的设计模式,代理模式是给指定对象提供代理对象。由代理对象来控制具体对象的引用。

代理模式涉及到的角色:

抽象主题角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替。

  1. 代理主题角色:含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题。代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作。

    真实代理对象:定义了代理角色所代表的具体对象。

(设计模式是通用的)

按照代理创建的时期代理类可以分成两种:

静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在        了。

动态代理:在程序运行时,运用反射机制动态创建而成。

二、静态代理

Talk is cheap,show me the code

首先定义个酒厂的接口:

WineFactory.java

    package ml.orlion.proxy;    
    
    public interface WineFactory {
    
     public void sell();
    }

然后再定义一个酒厂类实现这个接口:

WineFactoryImpl.java

    package ml.orlion.proxy;

    public class WineFactoryImpl implements WineFactory{
    
     @Override
     public void sell() {
     System.out.println("卖酒");
     }
    
    }

然后定义一个代理类,对酒厂进行代理:

WineFactoryProxy.java

    package ml.orlion.proxy;
    /**
     * 代理类
     * 对WineFactoryImpl进行代理
     */
    public class WineFactoryProxy implements WineFactory{
    
     private WineFactory winef;
    
     public WineFactoryProxy(WineFactory winef){
     this.winef = winef;
     }
    
     @Override
     public void sell() {
     System.out.println("卖酒之前...");
     winef.sell();
     System.out.println("卖酒之后...");
     }
    }

三、动态代理

由静态代理的代码可以看到静态代理只能对一个接口进行服务,如果项目中有很多个接口,那么肯定会产生过多的代理。这时候就需要用到动态代理,由一个代理类完成所有的代理功能。动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。

JDK动态代理中包含一个InvocationHandler接口和一个Proxy类

(1)InvocationHandler接口

    public interface InvocationHandler {     
        public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 
    }

其中Object porxy:是被代理的对象

Method method:要调用的方法

Object[] args:要调用的方法的参数

(2)Proxy类

Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:

    public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,     InvocationHandler h)  throws IllegalArgumentException

其中ClassLoader loader:是类加载器;

(在java中主要有三种类加载器:

Booststrap ClassLoader:此加载器采用C++编写,一般开发中是看不到的;

Extendsion ClassLoader:用来进行扩展类的加载,一般对应的是jrelibext目录中的类;

AppClassLoader:(默认)加载classpath指定的类,是最常使用的是一种加载器。

Class<?>[] interfaces:得到全部接口;

InvocationHandler h:得到InvocationHandler接口的子类实例;

code:

WineFactory.java和WineFactoryImpl.java和静态代理的代码相同。

WineFactoryInvocationHandler.java:

    package ml.orlion.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * JDK动态代理类
     * 对WineFactoryImpl进行代理
     */
    public class WineFactoryInvocationHandler implements InvocationHandler{
    
     private Object target;
    
     @Override
     public Object invoke(Object porxy, Method m, Object[] args) throws Throwable {
    
     Object result = null;
    
     beforeMethod();
     // 执行
     result = m.invoke(target, args);
    
     afterMethod();
     return result;
     }
    
     public void beforeMethod(){
     System.out.println("卖酒之前...");
     }
    
     public void afterMethod(){
     System.out.println("卖酒之后...");
     }
    
     public Object getTarget() {
     return target;
     }
    
     public void setTarget(Object target) {
     this.target = target;
     }
    }

测试:

    // 产生一个被代理对象
    WineFactory wf = new WineFactoryImpl();
    // 将被代理对象交给InvocationHandler
    WineFactoryInvocationHandler wfih = new WineFactoryInvocationHandler();
    wfih.setTarget(wf);
    // 根据被代理对象产生一个代理
    WineFactory wfp = (WineFactory)Proxy.newProxyInstance(wf.getClass().getClassLoader(), wf.getClass().getInterfaces(), wfih);
    wfp.sell();

除了JDK动态代理外还有一种cglib动态代理,具体可参考文章(本文参考):http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

java静态代理与动态代理的更多相关文章

  1. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  2. Java:静态代理 and 动态代理

    代理模式是常用的设计模式,其特征是代理类与委托类具有相同的接口,在具体实现上,有静态代理和动态代理之分.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并 ...

  3. Java基础-静态代理与动态代理比较

    JAVA的静态代理与动态代理比较 静态代理类: 由程序员创建或由特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了.动态代理类: 在程序运行时,运用反射机制动态创建 ...

  4. java中静态代理,动态代理知识的补充

    文章转载自:http://blog.csdn.net/jialinqiang/article/details/8950989 一.Java动态代理 相对于静态代理的代理类在编译时生成(.class文件 ...

  5. java静态代理与动态代理简单分析

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理 ...

  6. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  7. Java静态代理和动态代理

    今天介绍一下代理设计模式,在业务场景中使用代理模式的好处有很多,包括什么权限校验,事务管理等等,具体有什么好处大家自动百度吧,我这里只解释代理模式的设计原理.首先这个设计模式出来的时候先是静态代理模式 ...

  8. java中的静态代理和动态代理,入门整理

    静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...

  9. Java 静态代理与动态代理

    代理模式 设想你的项目依赖第三方,但是你需要对其接口做一些数据检验.性能数据记录.异常处理等,合适的方法就是使用设计模式里的代理模式. 代理模式是常用的java设计模式,代理类与委托类有同样的接口,代 ...

  10. java之静态代理和动态代理

    我们以几个问题,来开始我们今天的学习,如果下面几个问题,你都能说出个一二,那么恭喜你,你已经掌握了这方面的知识.1,什么是代理模式?2,Java中,静态代理与动态代理的区别?3,Spring使用的是J ...

随机推荐

  1. ACM: Gym 101047K Training with Phuket's larvae - 思维题

     Gym 101047K Training with Phuket's larvae Time Limit:2000MS     Memory Limit:65536KB     64bit IO F ...

  2. 洛谷 P1827 美国血统 American Heritage Label:字符串Water

    题目描述 农夫约翰非常认真地对待他的奶牛们的血统.然而他不是一个真正优秀的记帐员.他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形 ...

  3. 图论 - 寻找fly真迹

    一天fly正坐在课堂上发呆,突然,他注意到了桌面上的一个字符串S1S2S3S4...Sn,这个字符串只由字符"a","b"和"c"构成.刚好 ...

  4. .net之美学习-前奏

    做程序员已经一年多 可是感觉自己的基础不是很好,最近买呢一本.net之美的书,决定开始读着本书,写篇随笔记录一下,后面我会通过读着个书 把里面的知识点记录下,没一个章节付上自己的总结

  5. mysql中生产表格多列统计问题

    for Example: select date_format(date,'%Y-%m-%d') as day, count(case when xinghao='a' then 1 end) as  ...

  6. Thinkphp的初级注意点

    开头话: 网站,说实话,是第一次做,也就直接选择了ThinkPHP这个开源框架.选择这个框架的原因...已经不记得了 貌似在我当时的认知中只有这个了,其它更优秀的框架也是这个毕业设计做到后期再去了解的 ...

  7. id选择器、类选择器、属性选择器

    在网页编辑时,通常要对样式进行各种设置.我们借助CSS样式设计中的选择器,就能很好很方便的对它们进行管理和设置了. 今天,跟大家分享一下几个常用的选择器:id选择器.类选择器.属性选择器. id选择器 ...

  8. 如何将本地的jar包上传到maven本地仓库中

    首先需要将本地的jar包做mvn install到本地仓库中 mvn install:install-file -Dfile=D:\skyeye-ruleInfo\lib\lucene-querypa ...

  9. hadoop+tachyon+spark的zybo cluster集群综合配置

    1.zybo cluster 架构简述: 1.1 zybo cluster 包含5块zybo 开发板组成一个集群,zybo的boot文件为digilent zybo reference design提 ...

  10. Android中Intent的用法总结

    Intent只在Android中特有,我把它比作一种运载工具,就像飞机一样,会把一些人带到某个地方,而且如果需要的话,还可以找到机上有哪些人员(数据),这就需要另外一些设备来支持(如:Bundle), ...