CGLIB动态代理

CGLIB动态代理:
针对类来实现代理的,对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用。
而JDK动态代理只能代理实现了接口的类,没有实现接口的类是不可以被代理的。

开始引入pom:

<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.1</version>
</dependency>

被代理类:

public class Car{

    public void move(){
        System.out.println("小汽车行驶中...");
    }
}

Cglib代理测试类:

public class CglibProxy implements MethodInterceptor {

    private Enhancer enhancer = new Enhancer();


    //通过这个方法,我们就可以得到代理类
    public Object getProxy(Class clazz){
        //设置创建子类的类
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }


    /**
     * 方法作用:拦截所有目标类方法的调用
     * @param o 目标类的实例
     * @param method 目标方法的反射对象
     * @param objects 方法的参数
     * @param methodProxy 代理类的实例
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("记录日志开始...");
        //代理类调用父类的方法
        methodProxy.invokeSuper(o,objects);
        System.out.println("记录日志结束...");
        return null;
    }


    /**
     * 测试main
     * @param args
     */
    public static void main(String[] args) {
        CglibProxy proxy = new CglibProxy();

        Car car = (Car) proxy.getProxy(Car.class);

        car.move();
    }

打印结果:

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

推荐阅读更多精彩内容

友情链接更多精彩内容