区别
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动态代理无法代理没有实现接口的类