动态代理用到了反射机制。
代理的基本要素包括三个:代理、目标对象、客户端(相当于下面代码实现中的Test类)。代理是目标对象和客户端之间的中介,增强客户端对目标对象的调用,同时也起到了解耦的作用。
代理也会增加程序的复杂度,因此它的使用根据业务需求来定。
一般代理
代码实现
AbstractObject 代码
package proxy;
public interface AbstractObject {
void request();
}
RealObject 代码
package proxy;
public class RealObject implements AbstractObject {
@Override
public void request() {
System.out.println("RealObject ... request...");
}
}
Proxy 代码
package proxy;
public class Proxy implements AbstractObject {
private RealObject realObject;
public Proxy() {
realObject = new RealObject();
}
@Override
public void request() {
this.preRequest();
realObject.request();
this.postRequest();
}
public void preRequest() {
System.out.println("proxy ... preRuquest...");
}
public void postRequest() {
System.out.println("proxy ... postRequest...");
}
}
测试
package proxy;
public class Test {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}
运行结果:
proxy ... preRuquest...
RealObject ... request...
proxy ... postRequest...
动态代理
Java中动态代理用到了反射机制,反射机制是在程序运行中,可以动态映射(获取)到某个类的对象。
代码实现
AbstractObject 代码
package proxy;
public interface AbstractObject {
void request();
}
RealObject 代码
package dynamic_proxy;
import proxy.AbstractObject;
public class RealObject implements AbstractObject {
@Override
public void request() {
System.out.println("RealObject");
}
}
RealObject2 代码
package dynamic_proxy;
import proxy.AbstractObject;
public class RealObject2 implements AbstractObject {
@Override
public void request() {
System.out.println("RealObject2");
}
}
测试
package dynamic_proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import proxy.AbstractObject;
public class Test {
public static void main(String[] args) {
AbstractObject subject = null;
InvocationHandler handler = null;
handler = new DynamicProxy(new RealObject2());
subject = (AbstractObject) Proxy.newProxyInstance(AbstractObject.class.getClassLoader(),
new Class[] {AbstractObject.class}, handler);
subject.request();
}
}
运行结果:
RealObject2