java 的三种代理模式 (三)——性能
https://cloud.tencent.com/developer/article/2422961
方法调用性能较高,避免了反射调用。
仅限于invokeSuper,so spring的cglib代理仍然用了反射
https://www.cnblogs.com/zwwhnly/p/17340026.html 这篇证明了invokeSuper没有用反射,而是2个switch case o(logn) + o(1)
先通过第一个switch methodName hash取得method从0开始的连续索引-o(logn), 然后第二个switch 调用发生 - o(1)
第一个switch case也可以定制为空间换时间用hash表,不过cglib和reflectasm都是用的switch树
https://www.zhihu.com/question/66004088/answer/2279409634?share_code=G8bXO9CduwDw&utm_psn=1934042358535659762
Java动态代理使用Java原生的反射API进行操作(运行期),在生成类上比较高效。 CGLIB使用ASM框架直接对字节码进行操作(编译期),在类的执行过程中比较高效
https://cloud.tencent.com/developer/article/2422961
在实际测试中,JDK动态代理在创建代理实例时的性能优于Cglib,而在方法调用时,Cglib的性能则优于JDK动态代理。这是因为JDK动态代理在方法调用时依赖于反射,而Cglib直接调用生成的子类方法(invokeSuper)。
reflectasm同样,生成慢,调用快,与cglib极为相似
浙公网安备 33010602011771号