关于JDK动态代理
JDK动态代理:
1.接口
2.对接口进行实现。
3.创建代理类实现invcationHandler接口,并对Invoke方法重写。
Public Object invoke(Object proxy,Method method,Object[] args)throwsThrowable{
returnnull;
}
需要一个代理对象proxy,一个方法和一个object数组。
因为是JDK动态代理,所以这些数据需要动态的获取。
通过newProxyInstance(classLoader loader,Class<?>[] interfaces,invocationHandler h)
生成代理类$Proxy0,代理类继承了Proxy.所以java动态代理只能对接口进行代理,代理对象提供接口数组,可以任意进行调用。
CGLIB动态代理:
CGLib 的原理是对指定目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对 final 修饰的类进行代理。
代理类继承MethodInterceptor,并重写Intercept方法。
Public Object intercept(Object proxy,Method method,Object[] objects,MethodProxy methodProxy)
proxy:cglib生成代理对象,增强的对象
method:被代理对象的方法,对哪个方法进行拦截增强
Objects:方法参数,拦截的方法传入的参数
methodProxy:代理方法。要触发父类的方法的对象,也就是生成的子类方法去覆盖父类方法的那个方法。
在intercept方法中对MethodProxy调用invokeSuper方法。
调用:
什么是Enhancer?
Enhancer是cglib中使用频率很高的一个类,它是一个字节码增强器,可以用来为无接口的类创建代理。它的功能与java自带的Proxy类挺相似的。它会根据某个给定的类创建子类,并且所有非final的方法都带有回调钩子。
new一个Enhancer对象
Enhancer.setSuperClass(需要被代理的类,作为父类使用)
Enhancer.setCallback(代理类)
Callback也有很多类。一般用的代理类是MethodIntercept。也可以选用LazyLoader、NoOp(啥都不干)、Dispatcher、InvacationHandler、FixedValue、CallbackFilter
通过enhancer.create创建得到代理对象,通过代理对象调用目标方法
如果有必要就用指定的回调对象创建一个新的对象实例。也就是用代理类去创建一个新的子类。