代理模式(二)
2019-01-19 本文已影响0人
半数的年
延续代理模式(一)的内容
(2)、cglib动态代理原理()
image.png- JDK动态生成一个实现代理动作接口的代理对象,最后强制转换给代理类中的target,以供在调用invoke()时, 调用method.invoke(target,args)
- Cglib动态生成一个被代理对象的子类,重写父类的方法。在调用实例化子类时,会调用super()创建父类的对象,并保存父类和子类的引用。methodProxy.invokeSuper(obj, objects);调用被代理对象方法
@Override
public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// obj 是被代理对象,由Cglib内部给创建的
// methodProxy代理方法,代理方法所在的类是 obj
// 在调用实例化子类时,会调用super()创建父类的对象,并保存其引用
System.out.println("媒婆有大把资源,说出你想要的");
methodProxy.invokeSuper(obj, objects);
System.out.println("媒婆把联系方式给你,你可以谈恋爱了");
return null;
}
代理人
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class DynamicMeiPo implements MethodInterceptor {
public Object newInstance(Class clazz){
Enhancer enhancer = new Enhancer();
// 把父类设置为谁?
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// obj 是被代理对象由Cglib给创建的
// 在调用实例化子类时,会调用super()创建父类的对象,并保存其引用
System.out.println("媒婆有大把资源,说出你想要的");
methodProxy.invokeSuper(obj, objects);
System.out.println("媒婆把联系方式给你,你可以谈恋爱了");
return null;
}
}
被代理人
public class XiaoYuan {
public void findLove() {
System.out.println("小元要找短头发、可爱的女生");
}
}