世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
- 意图
为对象创建一个代理以控制对这个对象的访问。 - 类图
- 实例
// 静态代理
interface ComProxyINF{
void play();
}
class ComProxyImpl implements ComProxyINF{
@Override
public void play() {
System.out.println("实例 --- ");
}
}
class ComProxy implements ComProxyINF{
private ComProxyINF comProxyINF;
public ComProxy(ComProxyINF comProxyINF){
this.comProxyINF = comProxyINF;
}
@Override
public void play() {
System.out.println("代理头 --- ");
comProxyINF.play();
System.out.println("代理尾 --- ");
}
}
// JDK 动态代理
interface JDKProxyINF{
void play();
}
class JDKProxyImpl implements JDKProxyINF{
@Override
public void play() {
System.out.println("JDK 实例 --- ");
}
}
//cglib 动态代理
class CgProxyImpl{
public void play(){
System.out.println("cg 实例 --- ");
}
}
- 测试
class ProxyTest{
public static void main(String[] args) {
// 静态代理
System.out.println("静态代理 : ");
ComProxy comProxy = new ComProxy(new ComProxyImpl());
comProxy.play();
// JDK动态代理
System.out.println("JDK 动态代理 : ");
JDKProxyINF jdkProxyImpl = new JDKProxyImpl();
JDKProxyINF jdkProxy = (JDKProxyINF)Proxy.newProxyInstance(jdkProxyImpl.getClass().getClassLoader(), new Class[]{JDKProxyINF.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK 代理头 --- ");
method.invoke(jdkProxyImpl, args);
System.out.println("JDK 代理尾 --- ");
return null;
}
});
jdkProxy.play();
// cglib 动态代理
System.out.println("cg 动态代理 : ");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(CgProxyImpl.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cg 代理头 --- ");
methodProxy.invokeSuper(o, objects);
System.out.println("cg 代理尾 --- ");
return null;
}
});
CgProxyImpl cgProxy = (CgProxyImpl) enhancer.create();
cgProxy.play();
}
}
运行结果:
静态代理 :
代理头 ---
实例 ---
代理尾 ---
JDK 动态代理 :
JDK 代理头 ---
JDK 实例 ---
JDK 代理尾 ---
cg 动态代理 :
cg 代理头 ---
cg 实例 ---
cg 代理尾 ---