设计模式: 代理模式--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机制直接调用方法的,执行效率会更高一些
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容