首页 »Java教程 » proxy代理:代理模式(Proxy)-利用反射机制实现的动态代理 »正文
proxy代理:代理模式(Proxy)-利用反射机制实现的动态代理
来源: 发布时间:星期四, 2008年12月18日 浏览:2次 评论:0
Java深入到 定程度,就不可避免 碰到设计模式这 概念,了解设计模式,将使自己对java中 接口或抽象类应用有更深 理解.设计模式在java 中型系统中应用广泛,遵循 定 编程模式,才能使自己 代码便于理解,易于交流,Proxy(代理)模式是比较常用 个模式. 在应用中有些对象有时候由于跨越网络或者其他障碍而不能够或者不想直接访问另个对象如果直接访问会给系统带来不必要复杂性这时候可以在客户和目标对象的间增加层中间层让代理对象来代替目标对象打点切 Proxy 使用场景: 1.远程(Remote)代理:为个位于区别地址空间对象提供个局域代表对象这个区别地址空间可以是在本机器中也可是在另台机器中远程代理又叫做大使(Ambassador)好处是系统可以将网络细节隐藏起来使得客户端不必考虑网络存在客户完全可以认为被代理对象是局域而不是远程而代理对象承担了大部份网络通讯工作由于客户可能没有意识到会启动个耗费时间远程因此客户没有必要思想准备 2.虚拟(Virtual)代理:根据需要创建个资源消耗较大对象使得此对象只在需要时才会被真正创建使用虚拟代理模式好处就是代理对象可以在必要时候才将被代理对象加载;代理可以对加载过程加以必要优化当个模块加载十分耗费资源情况下虚拟代理好处就非常明显 3.Copy-on-Write代理:虚拟代理种把复制(克隆)拖延到只有在客户端需要时才真正采取行动 4.保护(Protect or Access)代理:控制对个对象访问如果需要可以给区别用户提供区别级别使用权限保护代理好处是它可以在运行时间对用户有关权限进行检查然后在核实后决定将传递给被代理对象 5.Cache代理:为某个目标操作结果提供临时存储空间以便多个客户端可以共享这些结果 6.防火墙(Firewall)代理:保护目标不让恶意用户接近 7.同步化(Synchronization)代理:使几个用户能够同时使用个对象而没有冲突 8.智能引用(Smart Reference)代理:当个对象被引用时提供些额外操作比如将对此对象次数记录下来等
这里介绍是如何利用反射机制实现动态代理: 最常见情况是:但个应用已经开发结束后我们需要对针对些对象操作记录日志或者做些额外工作;在这种情况下我们如果为每个对象设计个代理类话显然会增加很多工作量如果采用反射机制话就可以轻松解决这个问题
在此写了4个java类来描述介绍说明Proxy设计模式动态代理实现方式;
1、 ReflectProxy.java 动态代理类 2、 IHelloWorld.java HelloWorld接口 3、 HelloWorld.java HelloWorld实现类 4、 ReflectProxyText.java 带有思路方法测试类
= 1、 ReflectProxy.java package proxy;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;
//通过实现InvocationHandler接口invoke思路方法 促使被代理对象思路方法别时都会出发invoke思路方法 public ReflectProxy implements InvocationHandler {
// 被代理对象 private Object proxyObject;
public ReflectProxy(Object proxyObject) { this.proxyObject = proxyObject; }
// 通过工厂模式生成个代理对象 public Object factory(Object proxyObject) { Class cls = proxyObject.getClass; Proxy.ProxyInstance(cls.getClassLoader, cls.getInterfaces, ReflectProxy(proxyObject));
}
//InvocationHandler 接口中思路方法 public Object invoke(Object proxy, Method method, Object args) throws Throwable { //在被代理类实际思路方法前操作 doBeforeCalling(method);
//输出被代理类实际思路方法中参数 (args != null) { for ( i = 0; i < args.length; i) { .out.prln("args[" + i + "]=" + args[i] + ""); } } //被代理类实际思路方法 Object o = method.invoke(proxyObject, args);
//在被代理类实际思路方法后操作 doAfterCalling(method);
o; } //在被代理类实际思路方法前操作 private void doBeforeCalling(Method method){ .out.prln("before calling [" + method + "]"); }
//在被代理类实际思路方法后操作 private void doAfterCalling(Method method){ .out.prln("after calling [" + method + "]"); }
} = 1 end
= 2、 IHelloWorld.java package proxy;
public erface IHelloWorld {
public void sayHello; public void sayBye; public void saySomething(String msg); } = 2 end
= 3、 HelloWorld.java package proxy;
public HelloWorld implements IHelloWorld {
public void sayBye { .out.prln("Hello World!"); }
public void sayHello { .out.prln("Bye!"); }
public void saySomething(String msg) { .out.prln(msg); } } = 3 end
= 4、 ReflectProxyText.java package proxy;
import java.util.ArrayList; import java.util.List;
public ReflectProxyText {
public void (String args) { try { //代理List接口对象 Object obj = ReflectProxy.factory( ArrayList<Object>(0)); List list = (List)obj; list.add("A"); list.add("B"); //代理IHelloWorld接口对象 obj = ReflectProxy.factory( HelloWorld); IHelloWorld helloWorld = (IHelloWorld)obj; helloWorld.sayHello; helloWorld.saySomething("How is everything!"); |