如何使用Proxy模式及Java内建的动态代理机制
时间:2011-03-23 zhangjunhd
1.Proxy模式
代理模式支持将某些操作从实际的对象中分离出来,通过它的代理类提供处理。这样便于修改和管理这些特定的操作。
下面示例一个代理模式的实现。
<<interface>>Subject.java
package com.zj.proxy;
public interface Subject {
void operation1();
void operation2(String arg);
}
现实类RealSubject.java
package com.zj.proxy;
public class RealSubject implements Subject {
public void operation1() {
System.out.println("Realer do operation1");
}
public void operation2(String arg) {
System.out.println("Realer do operation2 with " + arg);
}
}
代理类ProxySubject.java
package com.zj.proxy;
public class ProxySubject implements Subject {
private Subject proxied;// 被代理对象
public ProxySubject(Subject proxied) {
this.proxied = proxied;
}
public void operation1() {
System.out.println("Proxyer do operation1");
proxied.operation1();
}
public void operation2(String arg) {
System.out.println("Proxyer do operation2 with " + arg);
proxied.operation2(arg);
}
}
如何使用Proxy模式及Java内建的动态代理机制(2)
时间:2011-03-23 zhangjunhd
测试类SimpleProxyDemo.java
package com.zj.proxy.client;
import com.zj.proxy.Subject;
import com.zj.proxy.RealSubject;
import com.zj.proxy.ProxySubject;
public class SimpleProxyDemo {
public static void consumer(Subject subject) {
subject.operation1();
subject.operation2("ZJ");
}
public static void main(String[] args) {
RealSubject real = new RealSubject();
System.out.println("===Without Proxy===");
consumer(real);
System.out.println("===Use Proxy===");
consumer(new ProxySubject(real));
}
}
结果:
===Without Proxy===
Realer do operation1
Realer do operation2 with ZJ
===Use Proxy===
Proxyer do operation1
Realer do operation1
Proxyer do operation2 with ZJ
Realer do operation2 with ZJ
2.使用Java的动态代理机制
设计一个类用于实现InvocationHandle接口,InvocationHandler 是代理实例的调用处理程序实现的接口。
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
<<interface>>InvocationHandle.java
package java.lang.reflect;
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
对应invoke参数:
[1]proxy - 在其上调用方法的代理实例;
[2]method - 对应于在代理实例上调用的接口方法的 Method 实例;
[3]args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。
如何使用Proxy模式及Java内建的动态代理机制(3)
时间:2011-03-23 zhangjunhd
现在设计一个类实现该接口,并提供代理实例。
DynamicProxyHandler.java
package com.zj.proxy.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
pu
|