- JDK动态代理只能对实现了接口的类生成代理,而不是针对类。
- CGLIB是针对类实现代理,主要是指定的类生成一个子类,覆盖其中的方法,
- 并覆盖其中方法实现增强,但是因为采用的是继承,所以该类或方法最好不要声明成final,对于final修饰的类或方法,是无法继承的。
1.代理模式是什么
- 代理模式就是一种设计模式,简单的说就是在不修改源代码的基础上,实现功能的扩展。所谓代理模式是指客户端并不直接调用实际的对象或方法,而是间接调用了代理对象,完成调用实际的对象。
2.JDK动态代理
JDK动态代理是基于接口实现的
```java
public class Text {
public static Object getJDK(){
return Proxy.newProxyInstance(Text.class.getClassLoader(), new Class[]{代理的接口.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});
}
}
- Proxy:被代理的对象
- Method:代理的方法
- Args:传入的参数
## 3.Cglib动态代理
- Cglib是基于继承的,要实现cglib要导入相关的jar包、
```java
public class CglibProxy {
public static Object getPoexy(Object target){
Enhancer en=new Enhancer();
//设置父类
en.setSuperclass(target.getClass());
//设置回调函数
/**
* 参数一:代理对象
* 参数二:目标方法反射对象
* 参数三:目标方法参数
* 参数四:代理方法反射对象
*
* */
en.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object invoke = method.invoke(target, objects);
return invoke;
}
});
//使上述操作生效
Object o = en.create();
return o;
}
}