设计模式:代理模式和反射原理

转载 2012年03月22日 14:37:36

代理模式:为其他对象提供一种代理以控制对这个对象的访问。


Proxy和RealSubject类共同实现了Subject接口,这样一来,在任何地方使用RealSubject类的地方就可以使用Proxy类来代理。而在真正操作前可以对其进行一些其他操作。


静态代理:

静态代理即Proxy类为静态的,不能再程序加在到内存时动态的创建。看一下静态代理的时序图。


如果RealSubject这种类有许多,对应的Proxy类就会有很多。这样就出现了一个问题,即代理类过多,重复代码过多。动态代理则克服了这种困难。

动态代理:

    动态代理的意思即Proxy类是在程序加载到内存中动态的创建。

    JAVA中,代理类实现了反射中的InvocationHandler接口和ProxyMethod类即可实现动态代理。

    动态代理的过程:

    1.利用Proxy类反射机制创建出目标类。

    2.将实现了InvocationHandler接口的类放到动态创建的代理类中

    3.调用InvocationHandler接口的类的invoke方法和Method类。在这里Method是作为invoke方法的一个参数出现的。

    4.invoke方法中去调用实际要做的事情。

    看一下时序图:


PSJdk代理类我们是看不到的,这个类是通过Proxy类通过反射实例化来的,在实例化过程中,会New一个LogHandler类当成代理类中的一个参数。所以能调用LogHandler类中的invoke方法。


在动态代理类中的代码:

在这里把创建目标类写到了LogHandler类中,在实际开发中,这个方法可以单独的写到一个类中,在创建目标类的时候不要忘记new一个LogHandler放到其中即可。在代理中,用到了反射,下面是简单的反射原理。


反射原理:

在理解反射的时候,不得不说一下内存。

    先理解一下JVM的三个区:堆区,栈区,和方法去(静态区)。

   堆区:存放所有的对象,每个对象都有一个与其对应的class信息。JVM中只有一个堆区,堆区被所有的线程共享。

    栈区:存放所有基础数据类型的对象和所有自定义对象的引用,每个线程包含一个栈区。每个栈区中的数据都是私有的,其他栈不能访问。

   栈分为三部分:

        基本类型变量区、执行环境上下文、操作指令区(存放操作指令)

    方法区:即静态区,被所有的线程共享。方法区包含所有的classstatic变量。它们都是唯一的。

 

    在启动一个java虚拟机时,虚拟机要加载你程序里所用到的类 ,这个进程会首先跑到jdk中(在jdkjre/lib/ext文件夹里找那些jar文件),如果没有找到,会去classpath里设置的路径去找。

    在找到要执行的类时:

    1.首先将找到的类的信息加载到运行时数据区的方法区。这个过程叫做类的加载。所以一下static类型的在类的加载过程中就已经放到了方法区。所以不用实例化就能用一个static类型的方法。

    2.加载完成后,在new一个类时,首先就是去方法区看看有没有这个类的信息。如果没有这个类的信息,先装载这个类。then,加载完成后,会在堆区为new的这个类分配内存,有了内存就有了实例,而这个实例指向的是方法区的该类信息。其实就是存放了在方法区的地址。而反射就是利用了这一点

设计模式:代理模式和反射原理

代理模式:为其他对象提供一种代理以控制对这个对象的访问。 Proxy和RealSubject类共同实现了Subject接口,这样一来,在任何地方使用RealSubject类的地方就可以使用P...
  • xiaokui008
  • xiaokui008
  • 2012年03月05日 20:20
  • 7207

设计模式(1)--理解AOP(代理模式)

本文转载自: http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html 尊重原创Aspect Oriented Programm...
  • Mrzhoug
  • Mrzhoug
  • 2016年05月07日 11:00
  • 2620

Java设计模式——代理模式实现及原理

简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术。生活中的方方面面都可以虚拟到代码中。代理模式所讲的就是现实生活中的这么一个概念:中介。 代理模式的定义:给某一个对象提...
  • Goskalrie
  • Goskalrie
  • 2016年09月07日 13:43
  • 21365

六 设计模式之代理模式(或称委托模式)

定义   为其它对象提供一种代理以控制对这个对象的访问类图通用代码 抽象主题类 public interface Subject { public void request(); } 真实主...
  • guojun828
  • guojun828
  • 2011年01月20日 23:26
  • 7171

设计模式:代理模式(Proxy)

代理模式:为其他对象提供一种代理以控制对这个对象的访问。 代理模式中的角色: 抽象主题角色(Subject):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对...
  • u013256816
  • u013256816
  • 2016年03月29日 21:38
  • 4411

设计模式之装饰模式和代理模式区别与联系

一.你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制      1.最常见的代理就是权限判断了,权限就肯定是限制了      2.装饰模式是指增强被包装对象的功能   ...
  • sky_100
  • sky_100
  • 2016年09月13日 17:32
  • 10161

【设计模式】代理模式详解

前言 博主只是一名大三学生,文章内容难免有不足之处,欢迎批评指正。   正文 转载请注明出处: http://blog.csdn.net/h28496/article/details/46707621...
  • H28496
  • H28496
  • 2015年07月01日 10:45
  • 1381

java设计模式之装饰模式代理模式区别

初次看装饰模式的时候首先想到了上节讲的代理模式,代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。 各用一句话描述两个模式应该是这样的: 装...
  • crazy_meng
  • crazy_meng
  • 2016年04月13日 15:33
  • 1534

23种设计模式(6):代理模式

先看一个例子,是有关于打游戏杀怪兽的。 //先定义一个游戏者接口 public interface IGamePlayer { //登陆游戏 public void logi...
  • psp0001060
  • psp0001060
  • 2016年02月04日 22:05
  • 939

设计模式(结构型)之代理模式(Proxy Pattern)

代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式...
  • yanbober
  • yanbober
  • 2015年05月04日 18:48
  • 5698
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式:代理模式和反射原理
举报原因:
原因补充:

(最多只允许输入30个字)