美文网首页
CGLIB动态代理

CGLIB动态代理

作者: 青蛙过河 | 来源:发表于2018-02-24 13:58 被阅读6次

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

打印结果:

记录日志开始...
小汽车行驶中...
记录日志结束...

相关文章

网友评论

      本文标题:CGLIB动态代理

      本文链接:https://www.haomeiwen.com/subject/pwuqxftx.html