CGLIB动态代理

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方法

你可能感兴趣的:(java,cglib)