第二十三天(二)
1、JDK动态代理
通过java.lang.reflect Class Proxy类来创建代理类对象
只能为实现过某个接口(这里指售票接口)的java类提供代理对象
//售票接口
public interface ShouPiao {
void shoupiao();//抽象方法
}
//火车站类实现售票接口,可以售票啦
public class HuoCheZhan implements ShouPiao {
@Override
public void shoupiao() {
System.out.println("火车站售票");
}
}
//代理火车站也能售票
public class ProxyObject implements InvocationHandler {
private Object targetObject;
public ProxyObject(Object targetObject){
this.targetObject = targetObject;
}
public Object getProxy(){
//ClassLoader loader类加载器
ClassLoader loader = this.getClass().getClassLoader();
//Class<?> interface接口的反射对象
Class<?>[] interfaces = this.targetObject.getClass().getInterfaces();
//InvocationHandler h---this
return Proxy.newProxyInstance(loader,interfaces,this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(targetObject,args);
}
}
//测试
public class Main {
public static void main(String[] args) {
HuoCheZhan huoCheZhan = new HuoCheZhan();
ProxyObject proxyObject = new ProxyObject(huoCheZhan);
ShouPiao proxy = (ShouPiao)proxyObject.getProxy();
proxy.shoupiao();
}
}
2、CGlib代理
CGlib是一个第三方的开发包,用的时候需要自己事先下载导入到项目中(cglib-nodep-3.2.6.jar)
所有的java类提供代理类对象(可以弥补JDK代理的缺点)
//火车站Java类售票业务
public class HuoCheZhan{
public void shoupiao() {
System.out.println("火车站售票");
}
}
//代理
public class ProxyObject implements MethodInterceptor {
private Object targetObject;
public ProxyObject(Object targetObject){
this.targetObject = targetObject;
}
public Object getProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 拦截器
* @param o
* @param method
* @param objects
* @param methodProxy
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o,objects);
}
}
public class Main {
public static void main(String[] args) {
HuoCheZhan huoCheZhan = new HuoCheZhan();
//代理火车站售票业务
ProxyObject proxyObject = new ProxyObject(huoCheZhan);
HuoCheZhan proxy = (HuoCheZhan) proxyObject.getProxy();
proxy.shoupiao();
}
}
总结:JDK动态代理与CGlib动态代理区别
JDK动态代理 | CGlib动态代理 |
---|---|
动态生成代理对象 | 动态生成代理对象 |
JDK提供的反射包中Proxy这个类 | CGlib提供的Enhancer这个类(需要导包) |
只能为实现过接口的Java类创建代理对象 | 为任何Java类创建代理对象 |
推荐书籍:大话设计模式(java版)