Spring

代理模式(二)

2019-01-19  本文已影响0人  半数的年

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

(2)、cglib动态代理原理()
image.png
    @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("小元要找短头发、可爱的女生");
    }
}
上一篇下一篇

猜你喜欢

热点阅读