代理模式(二)

延续代理模式(一)的内容

(2)、cglib动态代理原理()
代理模式(二)_第1张图片
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("小元要找短头发、可爱的女生");
    }
}

你可能感兴趣的:(代理模式(二))