Java学习:Java动态代理(cglib)

上一篇关于java动态代理的jdk实现中,花了大量篇幅介绍了代理模式和静态代理,最后讲了jdk的动态代理实现,也讲到了jdk动态代理实现的一些约束:只能基于接口实现代理

关于jdk的动态代理实现可以参考:
Java动态代理(jdk)

但是我们实际的编码中,大量的类都没有实现任何接口,如何对这些类进行代理呢?答案是cglib

  • cglib简介:

CGLIB(Code Generation Library)是一个开源项目! 是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口 CGLIB底层是基于asm框架去实现字节码的生成

  • cglib实现动态代理的步骤:

1、实现MethodInterceptor接口 2、通过Enhancer实现代理类的创建(生成一个继承了客户类的子类

  • 范例代码:

实现MethodInterceptor接口的类:

public class Hacker implements MethodInterceptor {
    // 创建代理
    public Object getProxy(RealSubject subject)
    {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(subject.getClass());
        enhancer.setCallback(this);

        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        System.out.println("before the method is invoked");

        // 这里调用的是invokeSuper而不是invoke
        methodProxy.invokeSuper(o, objects);

        System.out.println("after the method is invoked");

        return null;
    }
}

测试代码:

public class TestMain {
    public static void main(String[] args) {
        RealSubject subject = new RealSubject();

        Hacker hacker = new Hacker();
        RealSubject proxy = (RealSubject) hacker.getProxy(subject);

        proxy.play();
    }
}

运行结果:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,593评论 11 349
  • 代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用; 代理模式需要以下几个角色: 1 主题:...
    凌渡冰阅读 2,948评论 0 1
  • 在工作之余看一些优秀源码的时候发现很多地方使用了动态代理,所以抽了一些时间对java的动态代理深入熟悉一下,这篇文...
    半支铅笔半块橡皮阅读 3,502评论 0 3
  • 微凉的风 从窗户缝里渗透进来 滴滴雨声和着钢琴的绵延传进神经向上扬起的地方 无端的思绪徒然进入到空无的境地 写下几...
    周子岚阅读 1,603评论 0 1
  • 调笑令(会宁初行) 洮水,洮水, 一杯云烟荟萃。 黄土剑指昆仑, 文章笑傲白银。 银白,银白, 远上东山一脉。
    野渡ing阅读 1,531评论 0 1

友情链接更多精彩内容