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();
    }
}

运行结果:

Java学习:Java动态代理(cglib)_第1张图片

你可能感兴趣的:(Java学习:Java动态代理(cglib))