关于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创建得到代理对象,通过代理对象调用目标方法
如果有必要就用指定的回调对象创建一个新的对象实例。也就是用代理类去创建一个新的子类。

posted @   NobodyHero  阅读(58)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示