设计模式: 代理模式--CGLIB动态代理

咱们还是根据媒婆介绍单身青年相亲的例子用CGLIB动态代理来实现:

// 首先还是先创建单身青年类
public class CGLibCustomer {

    // 同样写findLove防范, 注意: 这次不是实现接口方法,而是这个类自己的方法
    public void findLove(){
        System.out.println("肤白貌美大长腿");
    }
}
// 媒婆类 实现MethodInterceptor这个接口
public class CGLibMeipo implements MethodInterceptor {

    public Object getInstance(Class clazz) throws Exception {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);

        return enhancer.create();
    }

    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        before();
        Object obj = methodProxy.invokeSuper(o, objects);
        after();
        return obj;
    }

    private void before() {
        System.out.println("我是媒婆:我要给你找对象,我现在已经确定你的需求了");
        System.out.println("开始物色");
    }

    private void after() {
        System.out.println("如果可以就结婚");
    }
}

测试代码:

public static void main(String[] args) {
        try {
            CGLibCustomer obj = (CGLibCustomer) new CGLibMeipo().getInstance(CGLibCustomer.class);
            obj.findLove();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

运行结果:
我是媒婆:我要给你找对象,我现在已经确定你的需求了
开始物色
肤白貌美大长腿
如果可以就结婚

CGLIB动态代理和JDK动态代理的区别:

  1. JDK代理实现了被代理类的接口,而CGLIB代理集成了被代理类
  2. CGLIB代理和JDK代理都是在运行时期动态生成字节码,CGLIB代理生成代理类会比JDK代理生成代理类效率更低一些
    3.CGLIB动态代理是FastClass机制直接调用方法的,执行效率会更高一些

你可能感兴趣的:(设计模式: 代理模式--CGLIB动态代理)