JavaSE065静态代理模式深度剖析
《JavaSE065静态代理模式深度剖析》由会员分享,可在线阅读,更多相关《JavaSE065静态代理模式深度剖析(4页珍藏版)》请在装配图网上搜索。
1、Java SE 065 静态代理模式深度剖析一、“Class” class众所周知Java有个Object class,是所有Java classses的继承根源,其内声明了数个应该在所有Java class中被改写的methods: hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class object.Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive J
2、ava types(原生java类型,boolean,byte,char,short,int,long,float,double)以及关键词void。当一个class被加载,或当加载器class loader的defineClass()被jvm调用,JVM会自动产生一个Class object。如果你想借由“修改java标准库源码”来观察Class object的实际生成时机(例如在Class的constructor内添加一个println()),不能够!因为Class并没有public constructor.Class是Refelection起源。针对任何你想探堪的class,唯有先为它产
3、生一个Class object,接下来才能经由后者唤起为数十多个的Reflection APIs.二、”Class” object的取得途径java允许我们从多种途径为一个class生成对应的Class object。Class object诞生管道示例运用getClass()注:每个class都有此函数String str =”abc”;Class c1 = str.getClass();运用Class.getSuperclass()Button b = new Button();Class c1 = b.getClass();Classs c2 = c1.getSuperclass();运
4、用static methodClass.forName();(最常被使用)Class c1 = Class.forName(“”)Class c2 = Class.forName(“”);Class c3 = Class.forName(“java.util.LinkedList$Entry”);Class c4 = Class.forName(“I”);Class c5 = Class.forName(“I”); 运用.class语法Class c1 = String.classClass c4 = int.classClass c5 = int.class运用primitive wrapp
5、er classes的TYPE语法Class c1 = Boolean.TypeClass c2 = Byte.TYPEClass c3 = Character.TYPEClass c4 = Short.TYPEClass c5 = Integer.TYPEClass c6 = Long.TYPEClass c7 = Float.TYPE;Class c8 = Double.TYPEClass c9 = Void.TYPE三、代理模式(房屋中介租房)代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标
6、对象之间起到中介的作用。代理模式一般涉及的角色有抽象角色(租房子):声明真实对象和代理对象的共同接口代理角色(中介):代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装真实角色(房主):代理角色所代表的真实对象,是我们要最终要引用的对象。package com.javase.proxy;/* * 代理模式抽象角色 * 代理角色与真实角色所拥有的共同接口。 * author x_xiongjie * */public abstract cl
7、ass Subject public abstract void request();package com.javase.proxy;/* * 真实角色 * 房主 * author x_xiongjie * */public class RealSubject extends Subject Overridepublic void request() System.out.println(From real subject!);package com.javase.proxy;/* * 代理角色 * author x_xiongjie * */public class ProxySubjec
8、t extends Subject private RealSubject realSubject;/代理角色内部引用了真实角色Overridepublic void request() this.preRequest();/在真实角色操作之前所附加的操作if(null = realSubject)realSubject = new RealSubject();realSubject.request();/执行真实角色所完成的事情this.postRequest();/在真实角色操作之后所附加的操作。/增加代理角色自己可以完成的一些事情private void preRequest()Syst
9、em.out.println(pre request);private void postRequest()System.out.println(post request);package com.javase.proxy;public class Client public static void main(String args) Subject subject = new ProxySubject(); subject.request();struts2其实就是基于代理模式来的。解说:由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用Prox
10、ySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()可以处理一些其他问题。另外,如果要使用上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;如果事先不知道真实角色,该如何来使用代理呢?这个问题可以使用Java动态代理类来解决。代理类代理的真实角色在增加时,代理类也要同时增加,使用什么方式实现增加一个真实角色类,然后动态的为这个真实角色创建代理类呢?四、动态代理类Java动态代理类位于包下,一般
11、主要涉及到以下两个类(1) Interface InvocationHandler:该接口中定义了一个方法public Object invoke(Object obj,Method method,Object args)在实际使用时,第一个参数obj一般指代理类,method是被代理的方法,如上例中的request()方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。解说:(每一个代理实例都会有一个与之关联的调用处理器,当我们调用某一个代理实例的某一个方法的时候,这个方法调用就会被编码,并且被派发到它的调用处理器的invoke方法上。)参数1:obj表示invoke方法是调用
12、哪一个代理实例的方法。参数2: method对应于代理实例上的接口方法。参数3:args表示接口方法所需要接收的参数数组。(2)Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容。解说:用于创建动态代理类,它是动态代理类的父类。也就是说我们自己创建的动态代理类是Proxy类的一个子类。每一个代理实例都会有一个与之关联的InvocationHandler实例,这个实例是存在代理这个对象内部的,这样的话才能实现关联。protected Proxy(InvocationHandler h):构造函数,用于给内部的h赋值。static Class getProxyClass(Classloader loader,Class interface)
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。