静态代理
代理接口
public abstract class Subject {
protected abstract void operation();
}
目标类
public class RealObject extends Subject{
@Override
protected void operation() {
System.out.println("do operation ...");
}
}
代理类
public class ProxyObject extends Subject {
private RealObject realObject;
public ProxyObject(RealObject realObject) {
this.realObject = realObject;
}
@Override
protected void operation() {
System.out.println("do something before real operation ...");
if (realObject == null) {
realObject = new RealObject();
}
realObject.operation();
System.out.println("do something after real operation ...");
}
}
客户端
public class Client {
public static void main(String[] args) {
ProxyObject proxyObject = new ProxyObject(new RealObject());
proxyObject.operation();
}
}
动态代理
代理接口
public interface Subject {
void shopping();
void run();
}
目标类
public class Man implements Subject {
@Override
public void shopping() {
System.out.println("shopping...");
}
@Override
public void run() {
System.out.println("run...");
}
}
代理类
public class ManProxy implements InvocationHandler {
private Object realObject;
public ManProxy(Subject realObject) {
this.realObject = realObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(proxy.getClass().getName());
System.out.println("before...");
method.invoke(realObject, args);
System.out.println("after...");
return null;
}
}
客户端
public class Client {
public static void main(String[] args) {
Man man = new Man();
ManProxy manProxy = new ManProxy(man);
Subject subject = (Subject) Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), manProxy);
subject.shopping();
subject.run();
System.out.println(subject.getClass().getName());
}
}