Jdk动态代理和CGLib动态代理

Posted by KANG's BLOG on Tuesday, March 15, 2022

区别

jdk的动态代理是基于接口的动态代理,要求目标对象必须实现至少一个接口,核心API是java.lang.reflect.Proxy类的newProxyInstance方法。

Object proxy = Proxy.newProxyInstance(
    ClassLoader loader,
    Class[] interfaces,
    InvocationHandler handler
);

cglib的动态代理是基于子类的动态代理,不需要目标对象实现接口,要求被代理类不能由final修饰.核心API是cglib.proxy.Enhancer类的create方法。

Enhancer.create(目标对象.getClass(), new MethodInterceptor() {
    /**
     * @param proxy:代理对象引用
     * @param method:目标对象方法(通过它可以访问目标对象)
     * @param args:传递给目标对象的参数
     * @MethodProxy methodProxy:代理对象的方法
     * @return 返回值
     * @throws Throwable
     */
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
            //功能代码
            return result;
    }
});

总结

Jdk动态代理无法代理没有实现接口的类