Java动态代理—CGLIB DynamicProxy

Posted Moon&&Dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java动态代理—CGLIB DynamicProxy相关的知识,希望对你有一定的参考价值。

动态代理—CGLIB DynamicProxy

CGLIB是利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

1 CGLIB和JDK的区别

JDKCGLIB
基于接口实现基于基础(目标类不能被final修饰)

2 导入依赖

<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>2.2.2</version>
</dependency>

3 实现MethodInterceptor接口

/**
 * @author 晓龙
 * @version 1.8.271
 * @ProtectName Proxy
 * @ClassName MyCglibProxy
 * @Description 基于Cglib动态代理
 * @createTime 2021年05月29日 20:37:00
 */
public class MyCglibProxy implements MethodInterceptor {
    /**
     * @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 {
        Object o1 = methodProxy.invokeSuper(o, objects);
        System.out.println("来自Cglib");
        return o1;
    }
}

4 实例Enhancer对象

public Object getProxy(Object target) {
        Enhancer enhancer = new Enhancer();
        // 设置父类(目标对象类)class
        enhancer.setSuperclass(target.getClass());
        // 设置回调器
        enhancer.setCallback(this);
        // 生成代理对象
        Object o = enhancer.create();
        return o;
    }

5 测试类

public class App {
    public static void main(String[] args) {
        // 目标对象
        HouseService houseService = new HouseService();
        // cglib代理类
        MyCglibProxy myCglibProxy = new MyCglibProxy();
        // 获得代理
        HouseService proxy = (HouseService) myCglibProxy.getProxy(houseService);
        // 目标方法
        proxy.rentHouse();
    }
}

以上是关于Java动态代理—CGLIB DynamicProxy的主要内容,如果未能解决你的问题,请参考以下文章

Java入门提高篇Day12 Java代理——Cglib动态代理

(java反射-JDK动态代理)+CGLIB动态代理

java动态代理(JDK和cglib)

代理模式-CGLib动态代理

Java代理(jdk静态代理动态代理和cglib动态代理)

java 静态代理 JDK动态代理 Cglib动态代理