JDK的动态代理对象,需要一个或多个接口
CGLIB:不需要代理对象有接口。可在运行期间扩展JAVA类,实现JAVA接口
CGLIB是以拦截器方式进行代理,拦截的是某个类的某些方法,如果某些方法不想被拦截,可使用过滤进行过滤拦截。
步骤:
创建Enhancer的实例,Enhancer是一个增强对象,他可以在运行期间创建代理对象的子类。
设置Enhancer的属性。
setSuperclass(Class clazz),设置被代理对象的父类;
setCallback(Callback c),设置拦截类
setCallbacks(Callback[] c).设置一个拦截器类数组(多个拦截器)
setCallbackFilter(CallbackFilter f):设置过滤器
create():返回这个代理后的对象
写拦截器,实现MethodInterceptor接口,覆写intercept()方法
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println(method.getName() + " 被代理后调用了");
return proxy.invokeSuper(obj, args);
}
类似JDK的代理方式,这里是所有被过滤下来的方法所要走过的地方。
编写一个过滤类,实现CallbackFilter接口,并覆写accept()方法,返回一个int值,这个值,最小为0,拦截器可能有N个,设置在enhancer的setCallbacks里面了,这里返回的int就是设置进去的下标,从0开始。另外,CGLIB有个默认的构造器,NoOP.INSTANCE,这个拦截器什么都不干。
总结:整个过程,CGLIB在运行期间,由enhancer.create生成一个被代理对象的子类。
并根据CallbackFilter的accept方法,覆写了被代理对象中的所有方法,然后去执行MethodInterceptor的intercept方法